mirror of
https://github.com/IBM/fp-go.git
synced 2025-08-10 22:31:32 +02:00
fix: switch internal implementation of iterator from Tuple2 to Pair
Signed-off-by: Dr. Carsten Leue <carsten.leue@de.ibm.com>
This commit is contained in:
@@ -17,11 +17,11 @@ package stateless
|
||||
|
||||
import (
|
||||
G "github.com/IBM/fp-go/iterator/stateless/generic"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
P "github.com/IBM/fp-go/pair"
|
||||
)
|
||||
|
||||
// Compress returns an [Iterator] that filters elements from a data [Iterator] returning only those that have a corresponding element in selector [Iterator] that evaluates to `true`.
|
||||
// Stops when either the data or selectors iterator has been exhausted.
|
||||
func Compress[U any](sel Iterator[bool]) func(Iterator[U]) Iterator[U] {
|
||||
return G.Compress[Iterator[U], Iterator[bool], Iterator[T.Tuple2[U, bool]]](sel)
|
||||
return G.Compress[Iterator[U], Iterator[bool], Iterator[P.Pair[U, bool]]](sel)
|
||||
}
|
||||
|
@@ -18,11 +18,11 @@ package generic
|
||||
import (
|
||||
F "github.com/IBM/fp-go/function"
|
||||
O "github.com/IBM/fp-go/option"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
P "github.com/IBM/fp-go/pair"
|
||||
)
|
||||
|
||||
// Any returns `true` if any element of the iterable is `true`. If the iterable is empty, return `false`
|
||||
func Any[GU ~func() O.Option[T.Tuple2[GU, U]], FCT ~func(U) bool, U any](pred FCT) func(ma GU) bool {
|
||||
func Any[GU ~func() O.Option[P.Pair[GU, U]], FCT ~func(U) bool, U any](pred FCT) func(ma GU) bool {
|
||||
return F.Flow3(
|
||||
Filter[GU](pred),
|
||||
First[GU],
|
||||
|
@@ -20,18 +20,18 @@ import (
|
||||
C "github.com/IBM/fp-go/internal/chain"
|
||||
F "github.com/IBM/fp-go/internal/functor"
|
||||
O "github.com/IBM/fp-go/option"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
P "github.com/IBM/fp-go/pair"
|
||||
)
|
||||
|
||||
// Bind creates an empty context of type [S] to be used with the [Bind] operation
|
||||
func Do[GS ~func() O.Option[T.Tuple2[GS, S]], S any](
|
||||
func Do[GS ~func() O.Option[P.Pair[GS, S]], S any](
|
||||
empty S,
|
||||
) GS {
|
||||
return Of[GS](empty)
|
||||
}
|
||||
|
||||
// Bind attaches the result of a computation to a context [S1] to produce a context [S2]
|
||||
func Bind[GS1 ~func() O.Option[T.Tuple2[GS1, S1]], GS2 ~func() O.Option[T.Tuple2[GS2, S2]], GA ~func() O.Option[T.Tuple2[GA, A]], S1, S2, A any](
|
||||
func Bind[GS1 ~func() O.Option[P.Pair[GS1, S1]], GS2 ~func() O.Option[P.Pair[GS2, S2]], GA ~func() O.Option[P.Pair[GA, A]], S1, S2, A any](
|
||||
setter func(A) func(S1) S2,
|
||||
f func(S1) GA,
|
||||
) func(GS1) GS2 {
|
||||
@@ -45,7 +45,7 @@ func Bind[GS1 ~func() O.Option[T.Tuple2[GS1, S1]], GS2 ~func() O.Option[T.Tuple2
|
||||
}
|
||||
|
||||
// Let attaches the result of a computation to a context [S1] to produce a context [S2]
|
||||
func Let[GS1 ~func() O.Option[T.Tuple2[GS1, S1]], GS2 ~func() O.Option[T.Tuple2[GS2, S2]], S1, S2, A any](
|
||||
func Let[GS1 ~func() O.Option[P.Pair[GS1, S1]], GS2 ~func() O.Option[P.Pair[GS2, S2]], S1, S2, A any](
|
||||
key func(A) func(S1) S2,
|
||||
f func(S1) A,
|
||||
) func(GS1) GS2 {
|
||||
@@ -57,7 +57,7 @@ func Let[GS1 ~func() O.Option[T.Tuple2[GS1, S1]], GS2 ~func() O.Option[T.Tuple2[
|
||||
}
|
||||
|
||||
// LetTo attaches the a value to a context [S1] to produce a context [S2]
|
||||
func LetTo[GS1 ~func() O.Option[T.Tuple2[GS1, S1]], GS2 ~func() O.Option[T.Tuple2[GS2, S2]], S1, S2, B any](
|
||||
func LetTo[GS1 ~func() O.Option[P.Pair[GS1, S1]], GS2 ~func() O.Option[P.Pair[GS2, S2]], S1, S2, B any](
|
||||
key func(B) func(S1) S2,
|
||||
b B,
|
||||
) func(GS1) GS2 {
|
||||
@@ -69,7 +69,7 @@ func LetTo[GS1 ~func() O.Option[T.Tuple2[GS1, S1]], GS2 ~func() O.Option[T.Tuple
|
||||
}
|
||||
|
||||
// BindTo initializes a new state [S1] from a value [T]
|
||||
func BindTo[GS1 ~func() O.Option[T.Tuple2[GS1, S1]], GA ~func() O.Option[T.Tuple2[GA, A]], S1, A any](
|
||||
func BindTo[GS1 ~func() O.Option[P.Pair[GS1, S1]], GA ~func() O.Option[P.Pair[GA, A]], S1, A any](
|
||||
setter func(A) S1,
|
||||
) func(GA) GS1 {
|
||||
return C.BindTo(
|
||||
@@ -79,7 +79,7 @@ func BindTo[GS1 ~func() O.Option[T.Tuple2[GS1, S1]], GA ~func() O.Option[T.Tuple
|
||||
}
|
||||
|
||||
// ApS attaches a value to a context [S1] to produce a context [S2] by considering the context and the value concurrently
|
||||
func ApS[GAS2 ~func() O.Option[T.Tuple2[GAS2, func(A) S2]], GS1 ~func() O.Option[T.Tuple2[GS1, S1]], GS2 ~func() O.Option[T.Tuple2[GS2, S2]], GA ~func() O.Option[T.Tuple2[GA, A]], S1, S2, A any](
|
||||
func ApS[GAS2 ~func() O.Option[P.Pair[GAS2, func(A) S2]], GS1 ~func() O.Option[P.Pair[GS1, S1]], GS2 ~func() O.Option[P.Pair[GS2, S2]], GA ~func() O.Option[P.Pair[GA, A]], S1, S2, A any](
|
||||
setter func(A) func(S1) S2,
|
||||
fa GA,
|
||||
) func(GS1) GS2 {
|
||||
|
@@ -18,17 +18,17 @@ package generic
|
||||
import (
|
||||
F "github.com/IBM/fp-go/function"
|
||||
O "github.com/IBM/fp-go/option"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
P "github.com/IBM/fp-go/pair"
|
||||
)
|
||||
|
||||
// Compress returns an [Iterator] that filters elements from a data [Iterator] returning only those that have a corresponding element in selector [Iterator] that evaluates to `true`.
|
||||
// Stops when either the data or selectors iterator has been exhausted.
|
||||
func Compress[GU ~func() O.Option[T.Tuple2[GU, U]], GB ~func() O.Option[T.Tuple2[GB, bool]], CS ~func() O.Option[T.Tuple2[CS, T.Tuple2[U, bool]]], U any](sel GB) func(GU) GU {
|
||||
func Compress[GU ~func() O.Option[P.Pair[GU, U]], GB ~func() O.Option[P.Pair[GB, bool]], CS ~func() O.Option[P.Pair[CS, P.Pair[U, bool]]], U any](sel GB) func(GU) GU {
|
||||
return F.Flow2(
|
||||
Zip[GU, GB, CS](sel),
|
||||
FilterMap[GU, CS](F.Flow2(
|
||||
O.FromPredicate(T.Second[U, bool]),
|
||||
O.Map(T.First[U, bool]),
|
||||
O.FromPredicate(P.Tail[U, bool]),
|
||||
O.Map(P.Head[U, bool]),
|
||||
)),
|
||||
)
|
||||
}
|
||||
|
@@ -18,12 +18,12 @@ package generic
|
||||
import (
|
||||
F "github.com/IBM/fp-go/function"
|
||||
O "github.com/IBM/fp-go/option"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
P "github.com/IBM/fp-go/pair"
|
||||
)
|
||||
|
||||
func Cycle[GU ~func() O.Option[T.Tuple2[GU, U]], U any](ma GU) GU {
|
||||
func Cycle[GU ~func() O.Option[P.Pair[GU, U]], U any](ma GU) GU {
|
||||
// avoid cyclic references
|
||||
var m func(O.Option[T.Tuple2[GU, U]]) O.Option[T.Tuple2[GU, U]]
|
||||
var m func(O.Option[P.Pair[GU, U]]) O.Option[P.Pair[GU, U]]
|
||||
|
||||
recurse := func(mu GU) GU {
|
||||
return F.Nullary2(
|
||||
@@ -32,11 +32,11 @@ func Cycle[GU ~func() O.Option[T.Tuple2[GU, U]], U any](ma GU) GU {
|
||||
)
|
||||
}
|
||||
|
||||
m = O.Fold(func() O.Option[T.Tuple2[GU, U]] {
|
||||
m = O.Fold(func() O.Option[P.Pair[GU, U]] {
|
||||
return recurse(ma)()
|
||||
}, F.Flow2(
|
||||
T.Map2(recurse, F.Identity[U]),
|
||||
O.Of[T.Tuple2[GU, U]],
|
||||
P.BiMap(recurse, F.Identity[U]),
|
||||
O.Of[P.Pair[GU, U]],
|
||||
))
|
||||
|
||||
return recurse(ma)
|
||||
|
@@ -18,17 +18,17 @@ package generic
|
||||
import (
|
||||
F "github.com/IBM/fp-go/function"
|
||||
O "github.com/IBM/fp-go/option"
|
||||
P "github.com/IBM/fp-go/predicate"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
P "github.com/IBM/fp-go/pair"
|
||||
PR "github.com/IBM/fp-go/predicate"
|
||||
)
|
||||
|
||||
// DropWhile creates an [Iterator] that drops elements from the [Iterator] as long as the predicate is true; afterwards, returns every element.
|
||||
// Note, the [Iterator] does not produce any output until the predicate first becomes false
|
||||
func DropWhile[GU ~func() O.Option[T.Tuple2[GU, U]], U any](pred func(U) bool) func(GU) GU {
|
||||
func DropWhile[GU ~func() O.Option[P.Pair[GU, U]], U any](pred func(U) bool) func(GU) GU {
|
||||
// avoid cyclic references
|
||||
var m func(O.Option[T.Tuple2[GU, U]]) O.Option[T.Tuple2[GU, U]]
|
||||
var m func(O.Option[P.Pair[GU, U]]) O.Option[P.Pair[GU, U]]
|
||||
|
||||
fromPred := O.FromPredicate(P.Not(P.ContraMap(T.Second[GU, U])(pred)))
|
||||
fromPred := O.FromPredicate(PR.Not(PR.ContraMap(P.Tail[GU, U])(pred)))
|
||||
|
||||
recurse := func(mu GU) GU {
|
||||
return F.Nullary2(
|
||||
@@ -37,11 +37,11 @@ func DropWhile[GU ~func() O.Option[T.Tuple2[GU, U]], U any](pred func(U) bool) f
|
||||
)
|
||||
}
|
||||
|
||||
m = O.Chain(func(t T.Tuple2[GU, U]) O.Option[T.Tuple2[GU, U]] {
|
||||
m = O.Chain(func(t P.Pair[GU, U]) O.Option[P.Pair[GU, U]] {
|
||||
return F.Pipe2(
|
||||
t,
|
||||
fromPred,
|
||||
O.Fold(recurse(Next(t)), O.Of[T.Tuple2[GU, U]]),
|
||||
O.Fold(recurse(Next(t)), O.Of[P.Pair[GU, U]]),
|
||||
)
|
||||
})
|
||||
|
||||
|
@@ -18,13 +18,13 @@ package generic
|
||||
import (
|
||||
F "github.com/IBM/fp-go/function"
|
||||
O "github.com/IBM/fp-go/option"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
P "github.com/IBM/fp-go/pair"
|
||||
)
|
||||
|
||||
// First returns the first item in an iterator if such an item exists
|
||||
func First[GU ~func() O.Option[T.Tuple2[GU, U]], U any](mu GU) O.Option[U] {
|
||||
func First[GU ~func() O.Option[P.Pair[GU, U]], U any](mu GU) O.Option[U] {
|
||||
return F.Pipe1(
|
||||
mu(),
|
||||
O.Map(T.Second[GU, U]),
|
||||
O.Map(P.Tail[GU, U]),
|
||||
)
|
||||
}
|
||||
|
@@ -19,16 +19,16 @@ import (
|
||||
F "github.com/IBM/fp-go/function"
|
||||
L "github.com/IBM/fp-go/io/generic"
|
||||
O "github.com/IBM/fp-go/option"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
P "github.com/IBM/fp-go/pair"
|
||||
)
|
||||
|
||||
// FromLazy returns an iterator on top of a lazy function
|
||||
func FromLazy[GU ~func() O.Option[T.Tuple2[GU, U]], LZ ~func() U, U any](l LZ) GU {
|
||||
func FromLazy[GU ~func() O.Option[P.Pair[GU, U]], LZ ~func() U, U any](l LZ) GU {
|
||||
return F.Pipe1(
|
||||
l,
|
||||
L.Map[LZ, GU](F.Flow2(
|
||||
F.Bind1st(T.MakeTuple2[GU, U], Empty[GU]()),
|
||||
O.Of[T.Tuple2[GU, U]],
|
||||
F.Bind1st(P.MakePair[GU, U], Empty[GU]()),
|
||||
O.Of[P.Pair[GU, U]],
|
||||
)),
|
||||
)
|
||||
}
|
||||
|
@@ -24,45 +24,45 @@ import (
|
||||
M "github.com/IBM/fp-go/monoid"
|
||||
N "github.com/IBM/fp-go/number"
|
||||
O "github.com/IBM/fp-go/option"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
P "github.com/IBM/fp-go/pair"
|
||||
)
|
||||
|
||||
// Next returns the iterator for the next element in an iterator `T.Tuple2`
|
||||
func Next[GU ~func() O.Option[T.Tuple2[GU, U]], U any](m T.Tuple2[GU, U]) GU {
|
||||
return T.First(m)
|
||||
// Next returns the iterator for the next element in an iterator `P.Pair`
|
||||
func Next[GU ~func() O.Option[P.Pair[GU, U]], U any](m P.Pair[GU, U]) GU {
|
||||
return P.Head(m)
|
||||
}
|
||||
|
||||
// Current returns the current element in an iterator `T.Tuple2`
|
||||
func Current[GU ~func() O.Option[T.Tuple2[GU, U]], U any](m T.Tuple2[GU, U]) U {
|
||||
return T.Second(m)
|
||||
// Current returns the current element in an iterator `P.Pair`
|
||||
func Current[GU ~func() O.Option[P.Pair[GU, U]], U any](m P.Pair[GU, U]) U {
|
||||
return P.Tail(m)
|
||||
}
|
||||
|
||||
// From constructs an array from a set of variadic arguments
|
||||
func From[GU ~func() O.Option[T.Tuple2[GU, U]], U any](data ...U) GU {
|
||||
func From[GU ~func() O.Option[P.Pair[GU, U]], U any](data ...U) GU {
|
||||
return FromArray[GU](data)
|
||||
}
|
||||
|
||||
// Empty returns the empty iterator
|
||||
func Empty[GU ~func() O.Option[T.Tuple2[GU, U]], U any]() GU {
|
||||
func Empty[GU ~func() O.Option[P.Pair[GU, U]], U any]() GU {
|
||||
return IO.None[GU]()
|
||||
}
|
||||
|
||||
// Of returns an iterator with one single element
|
||||
func Of[GU ~func() O.Option[T.Tuple2[GU, U]], U any](a U) GU {
|
||||
return IO.Of[GU](T.MakeTuple2(Empty[GU](), a))
|
||||
func Of[GU ~func() O.Option[P.Pair[GU, U]], U any](a U) GU {
|
||||
return IO.Of[GU](P.MakePair(Empty[GU](), a))
|
||||
}
|
||||
|
||||
// FromArray returns an iterator from multiple elements
|
||||
func FromArray[GU ~func() O.Option[T.Tuple2[GU, U]], US ~[]U, U any](as US) GU {
|
||||
func FromArray[GU ~func() O.Option[P.Pair[GU, U]], US ~[]U, U any](as US) GU {
|
||||
return A.MatchLeft(Empty[GU], func(head U, tail US) GU {
|
||||
return func() O.Option[T.Tuple2[GU, U]] {
|
||||
return O.Of(T.MakeTuple2(FromArray[GU](tail), head))
|
||||
return func() O.Option[P.Pair[GU, U]] {
|
||||
return O.Of(P.MakePair(FromArray[GU](tail), head))
|
||||
}
|
||||
})(as)
|
||||
}
|
||||
|
||||
// reduce applies a function for each value of the iterator with a floating result
|
||||
func reduce[GU ~func() O.Option[T.Tuple2[GU, U]], U, V any](as GU, f func(V, U) V, initial V) V {
|
||||
func reduce[GU ~func() O.Option[P.Pair[GU, U]], U, V any](as GU, f func(V, U) V, initial V) V {
|
||||
next, ok := O.Unwrap(as())
|
||||
current := initial
|
||||
for ok {
|
||||
@@ -74,18 +74,18 @@ func reduce[GU ~func() O.Option[T.Tuple2[GU, U]], U, V any](as GU, f func(V, U)
|
||||
}
|
||||
|
||||
// Reduce applies a function for each value of the iterator with a floating result
|
||||
func Reduce[GU ~func() O.Option[T.Tuple2[GU, U]], U, V any](f func(V, U) V, initial V) func(GU) V {
|
||||
func Reduce[GU ~func() O.Option[P.Pair[GU, U]], U, V any](f func(V, U) V, initial V) func(GU) V {
|
||||
return F.Bind23of3(reduce[GU, U, V])(f, initial)
|
||||
}
|
||||
|
||||
// ToArray converts the iterator to an array
|
||||
func ToArray[GU ~func() O.Option[T.Tuple2[GU, U]], US ~[]U, U any](u GU) US {
|
||||
func ToArray[GU ~func() O.Option[P.Pair[GU, U]], US ~[]U, U any](u GU) US {
|
||||
return Reduce[GU](A.Append[US], A.Empty[US]())(u)
|
||||
}
|
||||
|
||||
func Map[GV ~func() O.Option[T.Tuple2[GV, V]], GU ~func() O.Option[T.Tuple2[GU, U]], FCT ~func(U) V, U, V any](f FCT) func(ma GU) GV {
|
||||
func Map[GV ~func() O.Option[P.Pair[GV, V]], GU ~func() O.Option[P.Pair[GU, U]], FCT ~func(U) V, U, V any](f FCT) func(ma GU) GV {
|
||||
// pre-declare to avoid cyclic reference
|
||||
var m func(O.Option[T.Tuple2[GU, U]]) O.Option[T.Tuple2[GV, V]]
|
||||
var m func(O.Option[P.Pair[GU, U]]) O.Option[P.Pair[GV, V]]
|
||||
|
||||
recurse := func(ma GU) GV {
|
||||
return F.Nullary2(
|
||||
@@ -94,17 +94,17 @@ func Map[GV ~func() O.Option[T.Tuple2[GV, V]], GU ~func() O.Option[T.Tuple2[GU,
|
||||
)
|
||||
}
|
||||
|
||||
m = O.Map(T.Map2(recurse, f))
|
||||
m = O.Map(P.BiMap(recurse, f))
|
||||
|
||||
return recurse
|
||||
}
|
||||
|
||||
func MonadMap[GV ~func() O.Option[T.Tuple2[GV, V]], GU ~func() O.Option[T.Tuple2[GU, U]], U, V any](ma GU, f func(U) V) GV {
|
||||
func MonadMap[GV ~func() O.Option[P.Pair[GV, V]], GU ~func() O.Option[P.Pair[GU, U]], U, V any](ma GU, f func(U) V) GV {
|
||||
return Map[GV, GU](f)(ma)
|
||||
}
|
||||
|
||||
func concat[GU ~func() O.Option[T.Tuple2[GU, U]], U any](right, left GU) GU {
|
||||
var m func(ma O.Option[T.Tuple2[GU, U]]) O.Option[T.Tuple2[GU, U]]
|
||||
func concat[GU ~func() O.Option[P.Pair[GU, U]], U any](right, left GU) GU {
|
||||
var m func(ma O.Option[P.Pair[GU, U]]) O.Option[P.Pair[GU, U]]
|
||||
|
||||
recurse := func(left GU) GU {
|
||||
return F.Nullary2(left, m)
|
||||
@@ -113,16 +113,16 @@ func concat[GU ~func() O.Option[T.Tuple2[GU, U]], U any](right, left GU) GU {
|
||||
m = O.Fold(
|
||||
right,
|
||||
F.Flow2(
|
||||
T.Map2(recurse, F.Identity[U]),
|
||||
O.Some[T.Tuple2[GU, U]],
|
||||
P.BiMap(recurse, F.Identity[U]),
|
||||
O.Some[P.Pair[GU, U]],
|
||||
))
|
||||
|
||||
return recurse(left)
|
||||
}
|
||||
|
||||
func Chain[GV ~func() O.Option[T.Tuple2[GV, V]], GU ~func() O.Option[T.Tuple2[GU, U]], U, V any](f func(U) GV) func(GU) GV {
|
||||
func Chain[GV ~func() O.Option[P.Pair[GV, V]], GU ~func() O.Option[P.Pair[GU, U]], U, V any](f func(U) GV) func(GU) GV {
|
||||
// pre-declare to avoid cyclic reference
|
||||
var m func(O.Option[T.Tuple2[GU, U]]) O.Option[T.Tuple2[GV, V]]
|
||||
var m func(O.Option[P.Pair[GU, U]]) O.Option[P.Pair[GV, V]]
|
||||
|
||||
recurse := func(ma GU) GV {
|
||||
return F.Nullary2(
|
||||
@@ -132,9 +132,9 @@ func Chain[GV ~func() O.Option[T.Tuple2[GV, V]], GU ~func() O.Option[T.Tuple2[GU
|
||||
}
|
||||
m = O.Chain(
|
||||
F.Flow3(
|
||||
T.Map2(recurse, f),
|
||||
T.Tupled2(concat[GV]),
|
||||
func(v GV) O.Option[T.Tuple2[GV, V]] {
|
||||
P.BiMap(recurse, f),
|
||||
P.Paired(concat[GV]),
|
||||
func(v GV) O.Option[P.Pair[GV, V]] {
|
||||
return v()
|
||||
},
|
||||
),
|
||||
@@ -143,11 +143,11 @@ func Chain[GV ~func() O.Option[T.Tuple2[GV, V]], GU ~func() O.Option[T.Tuple2[GU
|
||||
return recurse
|
||||
}
|
||||
|
||||
func MonadChain[GV ~func() O.Option[T.Tuple2[GV, V]], GU ~func() O.Option[T.Tuple2[GU, U]], U, V any](ma GU, f func(U) GV) GV {
|
||||
func MonadChain[GV ~func() O.Option[P.Pair[GV, V]], GU ~func() O.Option[P.Pair[GU, U]], U, V any](ma GU, f func(U) GV) GV {
|
||||
return Chain[GV, GU](f)(ma)
|
||||
}
|
||||
|
||||
func MonadChainFirst[GV ~func() O.Option[T.Tuple2[GV, V]], GU ~func() O.Option[T.Tuple2[GU, U]], U, V any](ma GU, f func(U) GV) GU {
|
||||
func MonadChainFirst[GV ~func() O.Option[P.Pair[GV, V]], GU ~func() O.Option[P.Pair[GU, U]], U, V any](ma GU, f func(U) GV) GU {
|
||||
return C.MonadChainFirst(
|
||||
MonadChain[GU, GU, U, U],
|
||||
MonadMap[GU, GV, V, U],
|
||||
@@ -156,7 +156,7 @@ func MonadChainFirst[GV ~func() O.Option[T.Tuple2[GV, V]], GU ~func() O.Option[T
|
||||
)
|
||||
}
|
||||
|
||||
func ChainFirst[GV ~func() O.Option[T.Tuple2[GV, V]], GU ~func() O.Option[T.Tuple2[GU, U]], U, V any](f func(U) GV) func(GU) GU {
|
||||
func ChainFirst[GV ~func() O.Option[P.Pair[GV, V]], GU ~func() O.Option[P.Pair[GU, U]], U, V any](f func(U) GV) func(GU) GU {
|
||||
return C.ChainFirst(
|
||||
Chain[GU, GU, U, U],
|
||||
Map[GU, GV, func(V) U, V, U],
|
||||
@@ -164,14 +164,14 @@ func ChainFirst[GV ~func() O.Option[T.Tuple2[GV, V]], GU ~func() O.Option[T.Tupl
|
||||
)
|
||||
}
|
||||
|
||||
func Flatten[GV ~func() O.Option[T.Tuple2[GV, GU]], GU ~func() O.Option[T.Tuple2[GU, U]], U any](ma GV) GU {
|
||||
func Flatten[GV ~func() O.Option[P.Pair[GV, GU]], GU ~func() O.Option[P.Pair[GU, U]], U any](ma GV) GU {
|
||||
return MonadChain(ma, F.Identity[GU])
|
||||
}
|
||||
|
||||
// MakeBy returns an [Iterator] with an infinite number of elements initialized with `f(i)`
|
||||
func MakeBy[GU ~func() O.Option[T.Tuple2[GU, U]], FCT ~func(int) U, U any](f FCT) GU {
|
||||
func MakeBy[GU ~func() O.Option[P.Pair[GU, U]], FCT ~func(int) U, U any](f FCT) GU {
|
||||
|
||||
var m func(int) O.Option[T.Tuple2[GU, U]]
|
||||
var m func(int) O.Option[P.Pair[GU, U]]
|
||||
|
||||
recurse := func(i int) GU {
|
||||
return F.Nullary2(
|
||||
@@ -181,12 +181,12 @@ func MakeBy[GU ~func() O.Option[T.Tuple2[GU, U]], FCT ~func(int) U, U any](f FCT
|
||||
}
|
||||
|
||||
m = F.Flow3(
|
||||
T.Replicate2[int],
|
||||
T.Map2(F.Flow2(
|
||||
P.Of[int],
|
||||
P.BiMap(F.Flow2(
|
||||
utils.Inc,
|
||||
recurse),
|
||||
f),
|
||||
O.Of[T.Tuple2[GU, U]],
|
||||
O.Of[P.Pair[GU, U]],
|
||||
)
|
||||
|
||||
// bootstrap
|
||||
@@ -194,13 +194,13 @@ func MakeBy[GU ~func() O.Option[T.Tuple2[GU, U]], FCT ~func(int) U, U any](f FCT
|
||||
}
|
||||
|
||||
// Replicate creates an infinite [Iterator] containing a value.
|
||||
func Replicate[GU ~func() O.Option[T.Tuple2[GU, U]], U any](a U) GU {
|
||||
func Replicate[GU ~func() O.Option[P.Pair[GU, U]], U any](a U) GU {
|
||||
return MakeBy[GU](F.Constant1[int](a))
|
||||
}
|
||||
|
||||
// Repeat creates an [Iterator] containing a value repeated the specified number of times.
|
||||
// Alias of [Replicate] combined with [Take]
|
||||
func Repeat[GU ~func() O.Option[T.Tuple2[GU, U]], U any](n int, a U) GU {
|
||||
func Repeat[GU ~func() O.Option[P.Pair[GU, U]], U any](n int, a U) GU {
|
||||
return F.Pipe2(
|
||||
a,
|
||||
Replicate[GU],
|
||||
@@ -209,13 +209,13 @@ func Repeat[GU ~func() O.Option[T.Tuple2[GU, U]], U any](n int, a U) GU {
|
||||
}
|
||||
|
||||
// Count creates an [Iterator] containing a consecutive sequence of integers starting with the provided start value
|
||||
func Count[GU ~func() O.Option[T.Tuple2[GU, int]]](start int) GU {
|
||||
func Count[GU ~func() O.Option[P.Pair[GU, int]]](start int) GU {
|
||||
return MakeBy[GU](N.Add(start))
|
||||
}
|
||||
|
||||
func FilterMap[GV ~func() O.Option[T.Tuple2[GV, V]], GU ~func() O.Option[T.Tuple2[GU, U]], FCT ~func(U) O.Option[V], U, V any](f FCT) func(ma GU) GV {
|
||||
func FilterMap[GV ~func() O.Option[P.Pair[GV, V]], GU ~func() O.Option[P.Pair[GU, U]], FCT ~func(U) O.Option[V], U, V any](f FCT) func(ma GU) GV {
|
||||
// pre-declare to avoid cyclic reference
|
||||
var m func(O.Option[T.Tuple2[GU, U]]) O.Option[T.Tuple2[GV, V]]
|
||||
var m func(O.Option[P.Pair[GU, U]]) O.Option[P.Pair[GV, V]]
|
||||
|
||||
recurse := func(ma GU) GV {
|
||||
return F.Nullary2(
|
||||
@@ -226,11 +226,11 @@ func FilterMap[GV ~func() O.Option[T.Tuple2[GV, V]], GU ~func() O.Option[T.Tuple
|
||||
|
||||
m = O.Fold(
|
||||
Empty[GV](),
|
||||
func(t T.Tuple2[GU, U]) O.Option[T.Tuple2[GV, V]] {
|
||||
func(t P.Pair[GU, U]) O.Option[P.Pair[GV, V]] {
|
||||
r := recurse(Next(t))
|
||||
return O.MonadFold(f(Current(t)), r, F.Flow2(
|
||||
F.Bind1st(T.MakeTuple2[GV, V], r),
|
||||
O.Some[T.Tuple2[GV, V]],
|
||||
F.Bind1st(P.MakePair[GV, V], r),
|
||||
O.Some[P.Pair[GV, V]],
|
||||
))
|
||||
},
|
||||
)
|
||||
@@ -238,26 +238,26 @@ func FilterMap[GV ~func() O.Option[T.Tuple2[GV, V]], GU ~func() O.Option[T.Tuple
|
||||
return recurse
|
||||
}
|
||||
|
||||
func Filter[GU ~func() O.Option[T.Tuple2[GU, U]], FCT ~func(U) bool, U any](f FCT) func(ma GU) GU {
|
||||
func Filter[GU ~func() O.Option[P.Pair[GU, U]], FCT ~func(U) bool, U any](f FCT) func(ma GU) GU {
|
||||
return FilterMap[GU, GU](O.FromPredicate(f))
|
||||
}
|
||||
|
||||
func Ap[GUV ~func() O.Option[T.Tuple2[GUV, func(U) V]], GV ~func() O.Option[T.Tuple2[GV, V]], GU ~func() O.Option[T.Tuple2[GU, U]], U, V any](ma GU) func(fab GUV) GV {
|
||||
func Ap[GUV ~func() O.Option[P.Pair[GUV, func(U) V]], GV ~func() O.Option[P.Pair[GV, V]], GU ~func() O.Option[P.Pair[GU, U]], U, V any](ma GU) func(fab GUV) GV {
|
||||
return Chain[GV, GUV](F.Bind1st(MonadMap[GV, GU], ma))
|
||||
}
|
||||
|
||||
func MonadAp[GUV ~func() O.Option[T.Tuple2[GUV, func(U) V]], GV ~func() O.Option[T.Tuple2[GV, V]], GU ~func() O.Option[T.Tuple2[GU, U]], U, V any](fab GUV, ma GU) GV {
|
||||
func MonadAp[GUV ~func() O.Option[P.Pair[GUV, func(U) V]], GV ~func() O.Option[P.Pair[GV, V]], GU ~func() O.Option[P.Pair[GU, U]], U, V any](fab GUV, ma GU) GV {
|
||||
return Ap[GUV, GV, GU](ma)(fab)
|
||||
}
|
||||
|
||||
func FilterChain[GVV ~func() O.Option[T.Tuple2[GVV, GV]], GV ~func() O.Option[T.Tuple2[GV, V]], GU ~func() O.Option[T.Tuple2[GU, U]], FCT ~func(U) O.Option[GV], U, V any](f FCT) func(ma GU) GV {
|
||||
func FilterChain[GVV ~func() O.Option[P.Pair[GVV, GV]], GV ~func() O.Option[P.Pair[GV, V]], GU ~func() O.Option[P.Pair[GU, U]], FCT ~func(U) O.Option[GV], U, V any](f FCT) func(ma GU) GV {
|
||||
return F.Flow2(
|
||||
FilterMap[GVV, GU](f),
|
||||
Flatten[GVV],
|
||||
)
|
||||
}
|
||||
|
||||
func FoldMap[GU ~func() O.Option[T.Tuple2[GU, U]], FCT ~func(U) V, U, V any](m M.Monoid[V]) func(FCT) func(ma GU) V {
|
||||
func FoldMap[GU ~func() O.Option[P.Pair[GU, U]], FCT ~func(U) V, U, V any](m M.Monoid[V]) func(FCT) func(ma GU) V {
|
||||
return func(f FCT) func(ma GU) V {
|
||||
return Reduce[GU](func(cur V, a U) V {
|
||||
return m.Concat(cur, f(a))
|
||||
@@ -265,6 +265,6 @@ func FoldMap[GU ~func() O.Option[T.Tuple2[GU, U]], FCT ~func(U) V, U, V any](m M
|
||||
}
|
||||
}
|
||||
|
||||
func Fold[GU ~func() O.Option[T.Tuple2[GU, U]], U any](m M.Monoid[U]) func(ma GU) U {
|
||||
func Fold[GU ~func() O.Option[P.Pair[GU, U]], U any](m M.Monoid[U]) func(ma GU) U {
|
||||
return Reduce[GU](m.Concat, m.Empty())
|
||||
}
|
||||
|
@@ -18,10 +18,10 @@ package generic
|
||||
import (
|
||||
F "github.com/IBM/fp-go/function"
|
||||
O "github.com/IBM/fp-go/option"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
P "github.com/IBM/fp-go/pair"
|
||||
)
|
||||
|
||||
// Last returns the last item in an iterator if such an item exists
|
||||
func Last[GU ~func() O.Option[T.Tuple2[GU, U]], U any](mu GU) O.Option[U] {
|
||||
func Last[GU ~func() O.Option[P.Pair[GU, U]], U any](mu GU) O.Option[U] {
|
||||
return reduce(mu, F.Ignore1of2[O.Option[U]](O.Of[U]), O.None[U]())
|
||||
}
|
||||
|
@@ -18,10 +18,10 @@ package generic
|
||||
import (
|
||||
"github.com/IBM/fp-go/internal/monad"
|
||||
O "github.com/IBM/fp-go/option"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
P "github.com/IBM/fp-go/pair"
|
||||
)
|
||||
|
||||
type iteratorMonad[A, B any, GA ~func() O.Option[T.Tuple2[GA, A]], GB ~func() O.Option[T.Tuple2[GB, B]], GAB ~func() O.Option[T.Tuple2[GAB, func(A) B]]] struct{}
|
||||
type iteratorMonad[A, B any, GA ~func() O.Option[P.Pair[GA, A]], GB ~func() O.Option[P.Pair[GB, B]], GAB ~func() O.Option[P.Pair[GAB, func(A) B]]] struct{}
|
||||
|
||||
func (o *iteratorMonad[A, B, GA, GB, GAB]) Of(a A) GA {
|
||||
return Of[GA, A](a)
|
||||
@@ -40,6 +40,6 @@ func (o *iteratorMonad[A, B, GA, GB, GAB]) Ap(fa GA) func(GAB) GB {
|
||||
}
|
||||
|
||||
// Monad implements the monadic operations for iterators
|
||||
func Monad[A, B any, GA ~func() O.Option[T.Tuple2[GA, A]], GB ~func() O.Option[T.Tuple2[GB, B]], GAB ~func() O.Option[T.Tuple2[GAB, func(A) B]]]() monad.Monad[A, B, GA, GB, GAB] {
|
||||
func Monad[A, B any, GA ~func() O.Option[P.Pair[GA, A]], GB ~func() O.Option[P.Pair[GB, B]], GAB ~func() O.Option[P.Pair[GAB, func(A) B]]]() monad.Monad[A, B, GA, GB, GAB] {
|
||||
return &iteratorMonad[A, B, GA, GB, GAB]{}
|
||||
}
|
||||
|
@@ -19,10 +19,10 @@ import (
|
||||
F "github.com/IBM/fp-go/function"
|
||||
M "github.com/IBM/fp-go/monoid"
|
||||
O "github.com/IBM/fp-go/option"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
P "github.com/IBM/fp-go/pair"
|
||||
)
|
||||
|
||||
func Monoid[GU ~func() O.Option[T.Tuple2[GU, U]], U any]() M.Monoid[GU] {
|
||||
func Monoid[GU ~func() O.Option[P.Pair[GU, U]], U any]() M.Monoid[GU] {
|
||||
return M.MakeMonoid(
|
||||
F.Swap(concat[GU]),
|
||||
Empty[GU](),
|
||||
|
@@ -24,10 +24,10 @@ import (
|
||||
N "github.com/IBM/fp-go/number"
|
||||
I "github.com/IBM/fp-go/number/integer"
|
||||
O "github.com/IBM/fp-go/option"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
P "github.com/IBM/fp-go/pair"
|
||||
)
|
||||
|
||||
func FromReflect[GR ~func() O.Option[T.Tuple2[GR, R.Value]]](val R.Value) GR {
|
||||
func FromReflect[GR ~func() O.Option[P.Pair[GR, R.Value]]](val R.Value) GR {
|
||||
// recursive callback
|
||||
var recurse func(idx int) GR
|
||||
|
||||
@@ -41,8 +41,8 @@ func FromReflect[GR ~func() O.Option[T.Tuple2[GR, R.Value]]](val R.Value) GR {
|
||||
L.Map(fromPred),
|
||||
LG.Map[L.Lazy[O.Option[int]], GR](O.Map(
|
||||
F.Flow2(
|
||||
T.Replicate2[int],
|
||||
T.Map2(F.Flow2(N.Add(1), recurse), val.Index),
|
||||
P.Of[int],
|
||||
P.BiMap(F.Flow2(N.Add(1), recurse), val.Index),
|
||||
),
|
||||
)),
|
||||
)
|
||||
|
@@ -18,14 +18,14 @@ package generic
|
||||
import (
|
||||
F "github.com/IBM/fp-go/function"
|
||||
O "github.com/IBM/fp-go/option"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
P "github.com/IBM/fp-go/pair"
|
||||
)
|
||||
|
||||
func apTuple[A, B any](t T.Tuple2[func(A) B, A]) T.Tuple2[B, A] {
|
||||
return T.MakeTuple2(t.F1(t.F2), t.F2)
|
||||
func apTuple[A, B any](t P.Pair[func(A) B, A]) P.Pair[B, A] {
|
||||
return P.MakePair(P.Head(t)(P.Tail(t)), P.Tail(t))
|
||||
}
|
||||
|
||||
func Scan[GV ~func() O.Option[T.Tuple2[GV, V]], GU ~func() O.Option[T.Tuple2[GU, U]], FCT ~func(V, U) V, U, V any](f FCT, initial V) func(ma GU) GV {
|
||||
func Scan[GV ~func() O.Option[P.Pair[GV, V]], GU ~func() O.Option[P.Pair[GU, U]], FCT ~func(V, U) V, U, V any](f FCT, initial V) func(ma GU) GV {
|
||||
// pre-declare to avoid cyclic reference
|
||||
var m func(GU) func(V) GV
|
||||
|
||||
@@ -33,7 +33,7 @@ func Scan[GV ~func() O.Option[T.Tuple2[GV, V]], GU ~func() O.Option[T.Tuple2[GU,
|
||||
return F.Nullary2(
|
||||
ma,
|
||||
O.Map(F.Flow2(
|
||||
T.Map2(m, F.Bind1st(f, current)),
|
||||
P.BiMap(m, F.Bind1st(f, current)),
|
||||
apTuple[V, GV],
|
||||
)),
|
||||
)
|
||||
|
@@ -19,10 +19,10 @@ import (
|
||||
F "github.com/IBM/fp-go/function"
|
||||
N "github.com/IBM/fp-go/number/integer"
|
||||
O "github.com/IBM/fp-go/option"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
P "github.com/IBM/fp-go/pair"
|
||||
)
|
||||
|
||||
func Take[GU ~func() O.Option[T.Tuple2[GU, U]], U any](n int) func(ma GU) GU {
|
||||
func Take[GU ~func() O.Option[P.Pair[GU, U]], U any](n int) func(ma GU) GU {
|
||||
// pre-declare to avoid cyclic reference
|
||||
var recurse func(ma GU, idx int) GU
|
||||
|
||||
@@ -34,7 +34,7 @@ func Take[GU ~func() O.Option[T.Tuple2[GU, U]], U any](n int) func(ma GU) GU {
|
||||
fromPred,
|
||||
O.Chain(F.Ignore1of1[int](F.Nullary2(
|
||||
ma,
|
||||
O.Map(T.Map2(F.Bind2nd(recurse, idx+1), F.Identity[U])),
|
||||
O.Map(P.BiMap(F.Bind2nd(recurse, idx+1), F.Identity[U])),
|
||||
))),
|
||||
)
|
||||
}
|
||||
|
@@ -18,7 +18,7 @@ package generic
|
||||
import (
|
||||
F "github.com/IBM/fp-go/function"
|
||||
O "github.com/IBM/fp-go/option"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
P "github.com/IBM/fp-go/pair"
|
||||
)
|
||||
|
||||
// addToMap makes a deep copy of a map and adds a value
|
||||
@@ -31,23 +31,23 @@ func addToMap[A comparable](a A, m map[A]bool) map[A]bool {
|
||||
return cpy
|
||||
}
|
||||
|
||||
func Uniq[AS ~func() O.Option[T.Tuple2[AS, A]], K comparable, A any](f func(A) K) func(as AS) AS {
|
||||
func Uniq[AS ~func() O.Option[P.Pair[AS, A]], K comparable, A any](f func(A) K) func(as AS) AS {
|
||||
|
||||
var recurse func(as AS, mp map[K]bool) AS
|
||||
|
||||
recurse = func(as AS, mp map[K]bool) AS {
|
||||
return F.Nullary2(
|
||||
as,
|
||||
O.Chain(func(a T.Tuple2[AS, A]) O.Option[T.Tuple2[AS, A]] {
|
||||
O.Chain(func(a P.Pair[AS, A]) O.Option[P.Pair[AS, A]] {
|
||||
return F.Pipe3(
|
||||
a.F2,
|
||||
P.Tail(a),
|
||||
f,
|
||||
O.FromPredicate(func(k K) bool {
|
||||
_, ok := mp[k]
|
||||
return !ok
|
||||
}),
|
||||
O.Fold(recurse(a.F1, mp), func(k K) O.Option[T.Tuple2[AS, A]] {
|
||||
return O.Of(T.MakeTuple2(recurse(a.F1, addToMap(k, mp)), a.F2))
|
||||
O.Fold(recurse(P.Head(a), mp), func(k K) O.Option[P.Pair[AS, A]] {
|
||||
return O.Of(P.MakePair(recurse(P.Head(a), addToMap(k, mp)), P.Tail(a)))
|
||||
}),
|
||||
)
|
||||
}),
|
||||
@@ -57,6 +57,6 @@ func Uniq[AS ~func() O.Option[T.Tuple2[AS, A]], K comparable, A any](f func(A) K
|
||||
return F.Bind2nd(recurse, make(map[K]bool, 0))
|
||||
}
|
||||
|
||||
func StrictUniq[AS ~func() O.Option[T.Tuple2[AS, A]], A comparable](as AS) AS {
|
||||
func StrictUniq[AS ~func() O.Option[P.Pair[AS, A]], A comparable](as AS) AS {
|
||||
return Uniq[AS](F.Identity[A])(as)
|
||||
}
|
||||
|
@@ -18,29 +18,29 @@ package generic
|
||||
import (
|
||||
F "github.com/IBM/fp-go/function"
|
||||
O "github.com/IBM/fp-go/option"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
P "github.com/IBM/fp-go/pair"
|
||||
)
|
||||
|
||||
// ZipWith applies a function to pairs of elements at the same index in two iterators, collecting the results in a new iterator. If one
|
||||
// input iterator is short, excess elements of the longer iterator are discarded.
|
||||
func ZipWith[AS ~func() O.Option[T.Tuple2[AS, A]], BS ~func() O.Option[T.Tuple2[BS, B]], CS ~func() O.Option[T.Tuple2[CS, C]], FCT ~func(A, B) C, A, B, C any](fa AS, fb BS, f FCT) CS {
|
||||
func ZipWith[AS ~func() O.Option[P.Pair[AS, A]], BS ~func() O.Option[P.Pair[BS, B]], CS ~func() O.Option[P.Pair[CS, C]], FCT ~func(A, B) C, A, B, C any](fa AS, fb BS, f FCT) CS {
|
||||
// pre-declare to avoid cyclic reference
|
||||
var m func(T.Tuple2[O.Option[T.Tuple2[AS, A]], O.Option[T.Tuple2[BS, B]]]) O.Option[T.Tuple2[CS, C]]
|
||||
var m func(P.Pair[O.Option[P.Pair[AS, A]], O.Option[P.Pair[BS, B]]]) O.Option[P.Pair[CS, C]]
|
||||
|
||||
recurse := func(as AS, bs BS) CS {
|
||||
return func() O.Option[T.Tuple2[CS, C]] {
|
||||
return func() O.Option[P.Pair[CS, C]] {
|
||||
// combine
|
||||
return F.Pipe1(
|
||||
T.MakeTuple2(as(), bs()),
|
||||
P.MakePair(as(), bs()),
|
||||
m,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
m = F.Flow2(
|
||||
O.SequenceTuple2[T.Tuple2[AS, A], T.Tuple2[BS, B]],
|
||||
O.Map(func(t T.Tuple2[T.Tuple2[AS, A], T.Tuple2[BS, B]]) T.Tuple2[CS, C] {
|
||||
return T.MakeTuple2(recurse(t.F1.F1, t.F2.F1), f(t.F1.F2, t.F2.F2))
|
||||
O.SequencePair[P.Pair[AS, A], P.Pair[BS, B]],
|
||||
O.Map(func(t P.Pair[P.Pair[AS, A], P.Pair[BS, B]]) P.Pair[CS, C] {
|
||||
return P.MakePair(recurse(P.Head(P.Head(t)), P.Head(P.Tail(t))), f(P.Tail(P.Head(t)), P.Tail(P.Tail(t))))
|
||||
}))
|
||||
|
||||
// trigger the recursion
|
||||
@@ -49,6 +49,6 @@ func ZipWith[AS ~func() O.Option[T.Tuple2[AS, A]], BS ~func() O.Option[T.Tuple2[
|
||||
|
||||
// Zip takes two iterators and returns an iterators of corresponding pairs. If one input iterators is short, excess elements of the
|
||||
// longer iterator are discarded
|
||||
func Zip[AS ~func() O.Option[T.Tuple2[AS, A]], BS ~func() O.Option[T.Tuple2[BS, B]], CS ~func() O.Option[T.Tuple2[CS, T.Tuple2[A, B]]], A, B any](fb BS) func(AS) CS {
|
||||
return F.Bind23of3(ZipWith[AS, BS, CS, func(A, B) T.Tuple2[A, B]])(fb, T.MakeTuple2[A, B])
|
||||
func Zip[AS ~func() O.Option[P.Pair[AS, A]], BS ~func() O.Option[P.Pair[BS, B]], CS ~func() O.Option[P.Pair[CS, P.Pair[A, B]]], A, B any](fb BS) func(AS) CS {
|
||||
return F.Bind23of3(ZipWith[AS, BS, CS, func(A, B) P.Pair[A, B]])(fb, P.MakePair[A, B])
|
||||
}
|
||||
|
@@ -20,19 +20,19 @@ import (
|
||||
L "github.com/IBM/fp-go/lazy"
|
||||
M "github.com/IBM/fp-go/monoid"
|
||||
O "github.com/IBM/fp-go/option"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
P "github.com/IBM/fp-go/pair"
|
||||
)
|
||||
|
||||
// Iterator represents a stateless, pure way to iterate over a sequence
|
||||
type Iterator[U any] L.Lazy[O.Option[T.Tuple2[Iterator[U], U]]]
|
||||
type Iterator[U any] L.Lazy[O.Option[P.Pair[Iterator[U], U]]]
|
||||
|
||||
// Next returns the [Iterator] for the next element in an iterator `T.Tuple2`
|
||||
func Next[U any](m T.Tuple2[Iterator[U], U]) Iterator[U] {
|
||||
// Next returns the [Iterator] for the next element in an iterator `P.Pair`
|
||||
func Next[U any](m P.Pair[Iterator[U], U]) Iterator[U] {
|
||||
return G.Next(m)
|
||||
}
|
||||
|
||||
// Current returns the current element in an [Iterator] `T.Tuple2`
|
||||
func Current[U any](m T.Tuple2[Iterator[U], U]) U {
|
||||
// Current returns the current element in an [Iterator] `P.Pair`
|
||||
func Current[U any](m P.Pair[Iterator[U], U]) U {
|
||||
return G.Current(m)
|
||||
}
|
||||
|
||||
|
@@ -19,7 +19,7 @@ import (
|
||||
"testing"
|
||||
|
||||
F "github.com/IBM/fp-go/function"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
P "github.com/IBM/fp-go/pair"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
@@ -29,14 +29,14 @@ func TestScan(t *testing.T) {
|
||||
|
||||
dst := F.Pipe1(
|
||||
src,
|
||||
Scan(func(cur T.Tuple2[int, string], val string) T.Tuple2[int, string] {
|
||||
return T.MakeTuple2(cur.F1+1, val)
|
||||
}, T.MakeTuple2(0, "")),
|
||||
Scan(func(cur P.Pair[int, string], val string) P.Pair[int, string] {
|
||||
return P.MakePair(P.Head(cur)+1, val)
|
||||
}, P.MakePair(0, "")),
|
||||
)
|
||||
|
||||
assert.Equal(t, ToArray(From(
|
||||
T.MakeTuple2(1, "a"),
|
||||
T.MakeTuple2(2, "b"),
|
||||
T.MakeTuple2(3, "c"),
|
||||
P.MakePair(1, "a"),
|
||||
P.MakePair(2, "b"),
|
||||
P.MakePair(3, "c"),
|
||||
)), ToArray(dst))
|
||||
}
|
||||
|
@@ -17,7 +17,7 @@ package stateless
|
||||
|
||||
import (
|
||||
G "github.com/IBM/fp-go/iterator/stateless/generic"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
P "github.com/IBM/fp-go/pair"
|
||||
)
|
||||
|
||||
// ZipWith applies a function to pairs of elements at the same index in two iterators, collecting the results in a new iterator. If one
|
||||
@@ -28,6 +28,6 @@ func ZipWith[FCT ~func(A, B) C, A, B, C any](fa Iterator[A], fb Iterator[B], f F
|
||||
|
||||
// Zip takes two iterators and returns an iterators of corresponding pairs. If one input iterators is short, excess elements of the
|
||||
// longer iterator are discarded
|
||||
func Zip[A, B any](fb Iterator[B]) func(Iterator[A]) Iterator[T.Tuple2[A, B]] {
|
||||
return G.Zip[Iterator[A], Iterator[B], Iterator[T.Tuple2[A, B]]](fb)
|
||||
func Zip[A, B any](fb Iterator[B]) func(Iterator[A]) Iterator[P.Pair[A, B]] {
|
||||
return G.Zip[Iterator[A], Iterator[B], Iterator[P.Pair[A, B]]](fb)
|
||||
}
|
||||
|
@@ -19,7 +19,7 @@ import (
|
||||
"fmt"
|
||||
"testing"
|
||||
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
P "github.com/IBM/fp-go/pair"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
@@ -40,5 +40,5 @@ func TestZip(t *testing.T) {
|
||||
|
||||
res := Zip[string](left)(right)
|
||||
|
||||
assert.Equal(t, ToArray(From(T.MakeTuple2("a", 1), T.MakeTuple2("b", 2), T.MakeTuple2("c", 3))), ToArray(res))
|
||||
assert.Equal(t, ToArray(From(P.MakePair("a", 1), P.MakePair("b", 2), P.MakePair("c", 3))), ToArray(res))
|
||||
}
|
||||
|
Reference in New Issue
Block a user