blob: fec9095f79678f6cb6f91c7fe06d62b84f72c948 [file] [log] [blame]
// 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,
}
}