1
0
mirror of https://github.com/IBM/fp-go.git synced 2026-04-01 15:06:27 +02:00

Compare commits

...

1 Commits

Author SHA1 Message Date
Dr. Carsten Leue
2b937d3e93 doc: add marble diagrams
Signed-off-by: Dr. Carsten Leue <carsten.leue@de.ibm.com>
2026-03-30 10:15:27 +02:00
9 changed files with 166 additions and 0 deletions

View File

@@ -34,6 +34,13 @@ import (
// 3. Filtering to keep only pairs where the boolean (tail) is true
// 4. Extracting the original values (head) from the filtered pairs
//
// Marble Diagram:
//
// Data: --1--2--3--4--5-->
// Selectors: --T--F--T--F--T-->
// Compress
// Output: --1-----3-----5-->
//
// RxJS Equivalent: Similar to combining [zip] with [filter] - https://rxjs.dev/api/operators/zip
//
// Type Parameters:

View File

@@ -21,6 +21,12 @@ package iter
// all elements repeatedly. When the end of the input sequence is reached, it starts over
// from the beginning, continuing this pattern forever.
//
// Marble Diagram:
//
// Input: --1--2--3|
// Cycle
// Output: --1--2--3--1--2--3--1--2--3--> (infinite)
//
// RxJS Equivalent: [repeat] - https://rxjs.dev/api/operators/repeat
//
// WARNING: This creates an INFINITE sequence for non-empty inputs. It must be used with

View File

@@ -23,6 +23,16 @@ import "github.com/IBM/fp-go/v2/option"
// contains at least one element, it returns Some(element). If the iterator is empty,
// it returns None. The function consumes only the first element of the iterator.
//
// Marble Diagram:
//
// Input: --1--2--3--4--5-->
// First
// Output: --Some(1)|
//
// Input: --|
// First
// Output: --None|
//
// RxJS Equivalent: [first] - https://rxjs.dev/api/operators/first
//
// Type Parameters:

View File

@@ -82,6 +82,12 @@ func Of2[K, A any](k K, a A) Seq2[K, A] {
// MonadMap transforms each element in a sequence using the provided function.
// This is the monadic version that takes the sequence as the first parameter.
//
// Marble Diagram:
//
// Input: --1--2--3-->
// Map(x => x * 2)
// Output: --2--4--6-->
//
// RxJS Equivalent: [map] - https://rxjs.dev/api/operators/map
//
// Example:
@@ -186,6 +192,12 @@ func MapWithKey[K, A, B any](f func(K, A) B) Operator2[K, A, B] {
// MonadFilter returns a sequence containing only elements that satisfy the predicate.
//
// Marble Diagram:
//
// Input: --1--2--3--4--5-->
// Filter(x => x % 2 == 0)
// Output: -----2-----4----->
//
// RxJS Equivalent: [filter] - https://rxjs.dev/api/operators/filter
//
// Example:
@@ -293,6 +305,12 @@ func FilterWithKey[K, A any](pred func(K, A) bool) Operator2[K, A, A] {
// MonadFilterMap applies a function that returns an Option to each element,
// keeping only the Some values and unwrapping them.
//
// Marble Diagram:
//
// Input: --1--2--3--4--5-->
// FilterMap(x => x % 2 == 0 ? Some(x * 10) : None)
// Output: -----20----40---->
//
// Example:
//
// seq := From(1, 2, 3, 4, 5)
@@ -430,6 +448,12 @@ func FilterMapWithKey[K, A, B any](f func(K, A) Option[B]) Operator2[K, A, B] {
// MonadChain applies a function that returns a sequence to each element and flattens the results.
// This is the monadic bind operation (flatMap).
//
// Marble Diagram:
//
// Input: --1-----2-----3---->
// Chain(x => [x, x*10])
// Output: --1-10--2-20--3-30->
//
// RxJS Equivalent: [mergeMap/flatMap] - https://rxjs.dev/api/operators/mergeMap
//
// Example:
@@ -473,6 +497,12 @@ func FlatMap[A, B any](f func(A) Seq[B]) Operator[A, B] {
// Flatten flattens a sequence of sequences into a single sequence.
//
// Marble Diagram:
//
// Input: --[1,2]--[3,4]--[5]-->
// Flatten
// Output: --1-2----3-4----5---->
//
// RxJS Equivalent: [mergeAll] - https://rxjs.dev/api/operators/mergeAll
//
// Example:
@@ -489,6 +519,14 @@ func Flatten[A any](mma Seq[Seq[A]]) Seq[A] {
// MonadAp applies a sequence of functions to a sequence of values.
// This is the applicative apply operation.
//
// Marble Diagram:
//
// Functions: --(*2)---(+10)-->
// Values: --5------3------>
// Ap
// Output: --10-6---15-13-->
// (each function applied to each value)
//
// Example:
//
// fns := From(N.Mul(2), N.Add(10))
@@ -577,6 +615,13 @@ func Replicate[A any](n int, a A) Seq[A] {
// MonadReduce reduces a sequence to a single value by applying a function to each element
// and an accumulator, starting with an initial value.
//
// Marble Diagram:
//
// Input: --1--2--3--4--5--|
// Reduce((acc, x) => acc + x, 0)
// Output: ------------------15|
// (emits final result only)
//
// RxJS Equivalent: [reduce] - https://rxjs.dev/api/operators/reduce
//
// Example:
@@ -811,6 +856,13 @@ func FoldMapWithKey[K, A, B any](m M.Monoid[B]) func(func(K, A) B) func(Seq2[K,
// MonadFlap applies a fixed value to a sequence of functions.
// This is the dual of MonadAp.
//
// Marble Diagram:
//
// Functions: --(*2)---(+10)-->
// Value: 5 (fixed)
// Flap
// Output: --10-----15----->
//
// Example:
//
// fns := From(N.Mul(2), N.Add(10))
@@ -832,6 +884,12 @@ func Flap[B, A any](a A) Operator[func(A) B, B] {
// Prepend returns a function that adds an element to the beginning of a sequence.
//
// Marble Diagram:
//
// Input: -----2--3--4-->
// Prepend(1)
// Output: --1--2--3--4-->
//
// RxJS Equivalent: [startWith] - https://rxjs.dev/api/operators/startWith
//
// Example:
@@ -847,6 +905,12 @@ func Prepend[A any](head A) Operator[A, A] {
// Append returns a function that adds an element to the end of a sequence.
//
// Marble Diagram:
//
// Input: --1--2--3-----|
// Append(4)
// Output: --1--2--3--4--|
//
// RxJS Equivalent: [endWith] - https://rxjs.dev/api/operators/endWith
//
// Example:
@@ -863,6 +927,14 @@ func Append[A any](tail A) Operator[A, A] {
// MonadZip combines two sequences into a sequence of pairs.
// The resulting sequence stops when either input sequence is exhausted.
//
// Marble Diagram:
//
// SeqA: --1--2--3---->
// SeqB: --a--b------->
// Zip
// Output: --(1,a)-(2,b)|
// (stops when shorter sequence ends)
//
// RxJS Equivalent: [zip] - https://rxjs.dev/api/operators/zip
//
// Example:
@@ -1090,6 +1162,12 @@ func FromSeqPair[A, B any](as Seq[Pair[A, B]]) Seq2[A, B] {
// The operation is lazy and only consumes elements from the source sequence as needed.
// The first n elements are consumed and discarded, then subsequent elements are yielded.
//
// Marble Diagram:
//
// Input: --1--2--3--4--5--6--7--8-->
// Skip(3)
// Output: -----------4--5--6--7--8-->
//
// RxJS Equivalent: [skip] - https://rxjs.dev/api/operators/skip
//
// Type Parameters:

View File

@@ -10,6 +10,16 @@ import (
// sequence. If the iterator contains at least one element, it returns Some(element).
// If the iterator is empty, it returns None.
//
// Marble Diagram:
//
// Input: --1--2--3--4--5--|
// Last
// Output: -----------------Some(5)|
//
// Input: --|
// Last
// Output: --None|
//
// RxJS Equivalent: [last] - https://rxjs.dev/api/operators/last
//
// Type Parameters:

View File

@@ -28,6 +28,13 @@ import (
//
// This is the monadic form that takes the sequence as the first parameter.
//
// Marble Diagram:
//
// Input: --1--2--3--4--5-->
// ChainOptionK(x => x % 2 == 0 ? Some(x * 10) : None)
// Output: -----20----40---->
// (filters and transforms)
//
// RxJS Equivalent: [concatMap] combined with [filter] - https://rxjs.dev/api/operators/concatMap
//
// Type parameters:
@@ -72,6 +79,13 @@ func MonadChainOptionK[A, B any](as Seq[A], f option.Kleisli[A, B]) Seq[B] {
// This is the curried version of [MonadChainOptionK], useful for function composition
// and creating reusable transformations.
//
// Marble Diagram:
//
// Input: --1--2--3--4--5-->
// ChainOptionK(x => x > 2 ? Some(x) : None)
// Output: --------3--4--5-->
// (filters out values <= 2)
//
// RxJS Equivalent: [concatMap] combined with [filter] - https://rxjs.dev/api/operators/concatMap
//
// Type parameters:

View File

@@ -24,6 +24,13 @@ package iter
//
// The operation is lazy - intermediate values are computed only as they are consumed.
//
// Marble Diagram:
//
// Input: --1--2--3--4--5-->
// Scan((acc, x) => acc + x, 0)
// Output: --1--3--6--10-15->
// (running sum)
//
// RxJS Equivalent: [scan] - https://rxjs.dev/api/operators/scan
//
// Scan is useful for:

View File

@@ -27,6 +27,12 @@ import F "github.com/IBM/fp-go/v2/function"
// Once n elements have been yielded, iteration stops immediately without consuming
// the remaining elements from the source.
//
// Marble Diagram:
//
// Input: --1--2--3--4--5--6--7--8-->
// Take(3)
// Output: --1--2--3|
//
// RxJS Equivalent: [take] - https://rxjs.dev/api/operators/take
//
// Type Parameters:
@@ -90,6 +96,13 @@ func Take[U any](n int) Operator[U, U] {
// Once the predicate returns false, iteration stops immediately without consuming
// the remaining elements from the source.
//
// Marble Diagram:
//
// Input: --1--2--3--4--5--2--1-->
// TakeWhile(x < 4)
// Output: --1--2--3|
// (stops at 4)
//
// RxJS Equivalent: [takeWhile] - https://rxjs.dev/api/operators/takeWhile
//
// Type Parameters:
@@ -158,6 +171,13 @@ func TakeWhile[U any](p Predicate[U]) Operator[U, U] {
// Once the predicate returns false, all remaining elements are yielded without further
// predicate evaluation.
//
// Marble Diagram:
//
// Input: --1--2--3--4--5--2--1-->
// SkipWhile(x < 4)
// Output: -----------4--5--2--1-->
// (starts at 4, continues with all)
//
// RxJS Equivalent: [skipWhile] - https://rxjs.dev/api/operators/skipWhile
//
// Type Parameters:

View File

@@ -32,6 +32,13 @@ import (
// the number of unique keys encountered. The operation is lazy - elements are processed
// and filtered as they are consumed.
//
// Marble Diagram:
//
// Input: --1--2--3--2--4--1--5-->
// Uniq(identity)
// Output: --1--2--3-----4-----5-->
// (first occurrence only)
//
// RxJS Equivalent: [distinct] - https://rxjs.dev/api/operators/distinct
//
// Type Parameters:
@@ -119,6 +126,13 @@ func Uniq[A any, K comparable](f func(A) K) Operator[A, A] {
// The operation maintains a map of seen elements internally, so memory usage grows with
// the number of unique elements. Only the first occurrence of each unique element is kept.
//
// Marble Diagram:
//
// Input: --1--2--3--2--4--1--5-->
// StrictUniq
// Output: --1--2--3-----4-----5-->
// (first occurrence only)
//
// RxJS Equivalent: [distinct] - https://rxjs.dev/api/operators/distinct
//
// Type Parameters: