| // Copyright 2022 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package goerror_fp |
| |
| type Seq[T any] []T |
| |
| func (r Seq[T]) Size() int { |
| return len(r) |
| } |
| |
| func (r Seq[T]) Append(items ...T) Seq[T] { |
| tail := Seq[T](items) |
| ret := make(Seq[T], r.Size()+tail.Size()) |
| |
| for i := range r { |
| ret[i] = r[i] |
| } |
| |
| for i := range tail { |
| ret[i+r.Size()] = tail[i] |
| } |
| |
| return ret |
| } |
| |
| func (r Seq[T]) Iterator() Iterator[T] { |
| idx := 0 |
| |
| return Iterator[T]{ |
| IsHasNext: func() bool { |
| return idx < r.Size() |
| }, |
| GetNext: func() T { |
| ret := r[idx] |
| idx++ |
| return ret |
| }, |
| } |
| } |
| |
| type Iterator[T any] struct { |
| IsHasNext func() bool |
| GetNext func() T |
| } |
| |
| func (r Iterator[T]) ToSeq() Seq[T] { |
| ret := Seq[T]{} |
| for r.HasNext() { |
| ret = append(ret, r.Next()) |
| } |
| return ret |
| } |
| |
| func (r Iterator[T]) Map(f func(T) any) Iterator[any] { |
| return MakeIterator(r.HasNext, func() any { |
| return f(r.Next()) |
| }) |
| } |
| |
| func (r Iterator[T]) HasNext() bool { |
| return r.IsHasNext() |
| } |
| |
| func (r Iterator[T]) Next() T { |
| return r.GetNext() |
| } |
| |
| func MakeIterator[T any](has func() bool, next func() T) Iterator[T] { |
| return Iterator[T]{ |
| IsHasNext: has, |
| GetNext: next, |
| } |
| } |