mirror of
https://github.com/duke-git/lancet.git
synced 2026-02-04 21:02:27 +08:00
62 lines
2.0 KiB
Go
62 lines
2.0 KiB
Go
// Copyright 2022 dudaodong@gmail.com. All rights resulterved.
|
|
// Use of this source code is governed by MIT license
|
|
|
|
// Package iterator provides a way to iterate over values stored in containers.
|
|
// note:
|
|
// 1. Full feature iterator is complicated, this pacakge is just a experiment to explore how iterators could work in Go.
|
|
// 2. The functionality of this package is very simple and limited, may not meet the actual dev needs.
|
|
// 3. It is currently under development, unstable, and will not be completed for some time in the future.
|
|
// So, based on above factors, you may not use it in production. but, anyone is welcome to improve it.
|
|
// Hope that Go can support iterator in future. see https://github.com/golang/go/discussions/54245 and https://github.com/golang/go/discussions/56413
|
|
package iterator
|
|
|
|
// Map creates a new iterator which applies a function to all items of input iterator.
|
|
func Map[T any, U any](iter Iterator[T], iteratee func(item T) U) Iterator[U] {
|
|
return &mapIterator[T, U]{
|
|
iter: iter,
|
|
iteratee: iteratee,
|
|
}
|
|
}
|
|
|
|
type mapIterator[T any, U any] struct {
|
|
iter Iterator[T]
|
|
iteratee func(T) U
|
|
}
|
|
|
|
func (mr *mapIterator[T, U]) HasNext() bool {
|
|
return mr.iter.HasNext()
|
|
}
|
|
|
|
func (mr *mapIterator[T, U]) Next() (U, bool) {
|
|
var zero U
|
|
item, ok := mr.iter.Next()
|
|
if !ok {
|
|
return zero, false
|
|
}
|
|
return mr.iteratee(item), true
|
|
}
|
|
|
|
// Filter creates a new iterator that returns only the items that pass specified predicate function.
|
|
func Filter[T any](iter Iterator[T], predicateFunc func(item T) bool) Iterator[T] {
|
|
return &filterIterator[T]{iter: iter, predicateFunc: predicateFunc}
|
|
}
|
|
|
|
type filterIterator[T any] struct {
|
|
iter Iterator[T]
|
|
predicateFunc func(T) bool
|
|
}
|
|
|
|
func (fr *filterIterator[T]) Next() (T, bool) {
|
|
for item, ok := fr.iter.Next(); ok; item, ok = fr.iter.Next() {
|
|
if fr.predicateFunc(item) {
|
|
return item, true
|
|
}
|
|
}
|
|
var zero T
|
|
return zero, false
|
|
}
|
|
|
|
func (fr *filterIterator[T]) HasNext() bool {
|
|
return fr.iter.HasNext()
|
|
}
|