mirror of
https://github.com/IBM/fp-go.git
synced 2025-09-03 20:06:08 +02:00
Compare commits
20 Commits
cleue-add-
...
cleue-add-
Author | SHA1 | Date | |
---|---|---|---|
|
1b1dccc551 | ||
|
39c6108bf5 | ||
|
83e1ff30c1 | ||
|
d9dda4cfa5 | ||
|
d9b2804a7e | ||
|
c0028918ae | ||
|
cd53cb7036 | ||
|
469c60f05d | ||
|
74fd0c96e7 | ||
|
e53e2c53e8 | ||
|
2cd35870cb | ||
|
411caa6dff | ||
|
d69a13ecf4 | ||
|
4ed0046971 | ||
|
e4fd34a6b5 | ||
|
89265eed7c | ||
|
fbc6757f82 | ||
|
a12936a86c | ||
|
94bcfde0d3 | ||
|
4e1cb825e7 |
9
.github/workflows/build.yml
vendored
9
.github/workflows/build.yml
vendored
@@ -17,22 +17,25 @@ on:
|
||||
env:
|
||||
# Currently no way to detect automatically
|
||||
DEFAULT_BRANCH: main
|
||||
GO_VERSION: 1.20.5 # renovate: datasource=golang-version depName=golang
|
||||
GO_VERSION: 1.20.6 # renovate: datasource=golang-version depName=golang
|
||||
NODE_VERSION: 18
|
||||
DRY_RUN: true
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
go-version: [ '1.20.x', '1.21.x' ]
|
||||
steps:
|
||||
# full checkout for semantic-release
|
||||
- uses: actions/checkout@c85c95e3d7251135ab7dc9ce3241c5835cc595a9 # v3.5.3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- name: Set up go ${{env.GO_VERSION}}
|
||||
- name: Set up go ${{ matrix.go-version }}
|
||||
uses: actions/setup-go@v4
|
||||
with:
|
||||
go-version: ${{env.GO_VERSION}}
|
||||
go-version: ${{ matrix.go-version }}
|
||||
-
|
||||
name: Tests
|
||||
run: |
|
||||
|
@@ -108,10 +108,16 @@ func MonadFilterMap[A, B any](fa []A, f func(a A) O.Option[B]) []B {
|
||||
return G.MonadFilterMap[[]A, []B](fa, f)
|
||||
}
|
||||
|
||||
// FilterChain maps an array with an iterating function that returns an [O.Option] and it keeps only the Some values discarding the Nones.
|
||||
func FilterMap[A, B any](f func(a A) O.Option[B]) func([]A) []B {
|
||||
return G.FilterMap[[]A, []B](f)
|
||||
}
|
||||
|
||||
// FilterChain maps an array with an iterating function that returns an [O.Option] of an array. It keeps only the Some values discarding the Nones and then flattens the result.
|
||||
func FilterChain[A, B any](f func(A) O.Option[[]B]) func([]A) []B {
|
||||
return G.FilterChain[[]A](f)
|
||||
}
|
||||
|
||||
func FilterMapRef[A, B any](pred func(a *A) bool, f func(a *A) B) func([]A) []B {
|
||||
return func(fa []A) []B {
|
||||
return filterMapRef(fa, pred, f)
|
||||
@@ -237,7 +243,7 @@ func Intercalate[A any](m M.Monoid[A]) func(A) func([]A) A {
|
||||
}
|
||||
|
||||
func Flatten[A any](mma [][]A) []A {
|
||||
return MonadChain(mma, F.Identity[[]A])
|
||||
return G.Flatten(mma)
|
||||
}
|
||||
|
||||
func Slice[A any](low, high int) func(as []A) []A {
|
||||
@@ -280,3 +286,21 @@ func IsNonNil[A any](as []A) bool {
|
||||
func ConstNil[A any]() []A {
|
||||
return array.ConstNil[[]A]()
|
||||
}
|
||||
|
||||
func SliceRight[A any](start int) func([]A) []A {
|
||||
return G.SliceRight[[]A](start)
|
||||
}
|
||||
|
||||
func Copy[A any](b []A) []A {
|
||||
return G.Copy(b)
|
||||
}
|
||||
|
||||
// FoldMap maps and folds an array. Map the Array passing each value to the iterating function. Then fold the results using the provided Monoid.
|
||||
func FoldMap[A, B any](m M.Monoid[B]) func(func(A) B) func([]A) B {
|
||||
return G.FoldMap[[]A](m)
|
||||
}
|
||||
|
||||
// Fold folds the array using the provided Monoid.
|
||||
func Fold[A any](m M.Monoid[A]) func([]A) A {
|
||||
return G.Fold[[]A](m)
|
||||
}
|
||||
|
@@ -16,6 +16,7 @@
|
||||
package array
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
@@ -142,3 +143,52 @@ func TestPartition(t *testing.T) {
|
||||
assert.Equal(t, T.MakeTuple2(Empty[int](), Empty[int]()), Partition(pred)(Empty[int]()))
|
||||
assert.Equal(t, T.MakeTuple2(From(1), From(3)), Partition(pred)(From(1, 3)))
|
||||
}
|
||||
|
||||
func TestFilterChain(t *testing.T) {
|
||||
src := From(1, 2, 3)
|
||||
|
||||
f := func(i int) O.Option[[]string] {
|
||||
if i%2 != 0 {
|
||||
return O.Of(From(fmt.Sprintf("a%d", i), fmt.Sprintf("b%d", i)))
|
||||
}
|
||||
return O.None[[]string]()
|
||||
}
|
||||
|
||||
res := FilterChain(f)(src)
|
||||
|
||||
assert.Equal(t, From("a1", "b1", "a3", "b3"), res)
|
||||
}
|
||||
|
||||
func TestFilterMap(t *testing.T) {
|
||||
src := From(1, 2, 3)
|
||||
|
||||
f := func(i int) O.Option[string] {
|
||||
if i%2 != 0 {
|
||||
return O.Of(fmt.Sprintf("a%d", i))
|
||||
}
|
||||
return O.None[string]()
|
||||
}
|
||||
|
||||
res := FilterMap(f)(src)
|
||||
|
||||
assert.Equal(t, From("a1", "a3"), res)
|
||||
}
|
||||
|
||||
func TestFoldMap(t *testing.T) {
|
||||
src := From("a", "b", "c")
|
||||
|
||||
fold := FoldMap[string](S.Monoid)(strings.ToUpper)
|
||||
|
||||
assert.Equal(t, "ABC", fold(src))
|
||||
}
|
||||
|
||||
func ExampleFoldMap() {
|
||||
src := From("a", "b", "c")
|
||||
|
||||
fold := FoldMap[string](S.Monoid)(strings.ToUpper)
|
||||
|
||||
fmt.Println(fold(src))
|
||||
|
||||
// Output: ABC
|
||||
|
||||
}
|
||||
|
@@ -18,6 +18,7 @@ package generic
|
||||
import (
|
||||
F "github.com/IBM/fp-go/function"
|
||||
"github.com/IBM/fp-go/internal/array"
|
||||
M "github.com/IBM/fp-go/monoid"
|
||||
O "github.com/IBM/fp-go/option"
|
||||
"github.com/IBM/fp-go/tuple"
|
||||
)
|
||||
@@ -118,6 +119,17 @@ func MonadFilterMap[GA ~[]A, GB ~[]B, A, B any](fa GA, f func(a A) O.Option[B])
|
||||
return filterMap[GA, GB](fa, f)
|
||||
}
|
||||
|
||||
func FilterChain[GA ~[]A, GB ~[]B, A, B any](f func(a A) O.Option[GB]) func(GA) GB {
|
||||
return F.Flow2(
|
||||
FilterMap[GA, []GB](f),
|
||||
Flatten[[]GB],
|
||||
)
|
||||
}
|
||||
|
||||
func Flatten[GAA ~[]GA, GA ~[]A, A any](mma GAA) GA {
|
||||
return MonadChain(mma, F.Identity[GA])
|
||||
}
|
||||
|
||||
func FilterMap[GA ~[]A, GB ~[]B, A, B any](f func(a A) O.Option[B]) func(GA) GB {
|
||||
return F.Bind2nd(MonadFilterMap[GA, GB, A, B], f)
|
||||
}
|
||||
@@ -180,3 +192,37 @@ func MatchLeft[AS ~[]A, A, B any](onEmpty func() B, onNonEmpty func(A, AS) B) fu
|
||||
return onNonEmpty(as[0], as[1:])
|
||||
}
|
||||
}
|
||||
|
||||
func Slice[AS ~[]A, A any](start int, end int) func(AS) AS {
|
||||
return func(a AS) AS {
|
||||
return a[start:end]
|
||||
}
|
||||
}
|
||||
|
||||
func SliceRight[AS ~[]A, A any](start int) func(AS) AS {
|
||||
return func(a AS) AS {
|
||||
return a[start:]
|
||||
}
|
||||
}
|
||||
|
||||
func Copy[AS ~[]A, A any](b AS) AS {
|
||||
buf := make(AS, len(b))
|
||||
copy(buf, b)
|
||||
return buf
|
||||
}
|
||||
|
||||
func FoldMap[AS ~[]A, A, B any](m M.Monoid[B]) func(func(A) B) func(AS) B {
|
||||
return func(f func(A) B) func(AS) B {
|
||||
return func(as AS) B {
|
||||
return array.Reduce(as, func(cur B, a A) B {
|
||||
return m.Concat(cur, f(a))
|
||||
}, m.Empty())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func Fold[AS ~[]A, A any](m M.Monoid[A]) func(AS) A {
|
||||
return func(as AS) A {
|
||||
return array.Reduce(as, m.Concat, m.Empty())
|
||||
}
|
||||
}
|
||||
|
@@ -18,11 +18,17 @@ package generic
|
||||
import (
|
||||
"sort"
|
||||
|
||||
F "github.com/IBM/fp-go/function"
|
||||
O "github.com/IBM/fp-go/ord"
|
||||
)
|
||||
|
||||
// Sort implements a stable sort on the array given the provided ordering
|
||||
func Sort[GA ~[]T, T any](ord O.Ord[T]) func(ma GA) GA {
|
||||
return SortByKey[GA](ord, F.Identity[T])
|
||||
}
|
||||
|
||||
// SortByKey implements a stable sort on the array given the provided ordering on an extracted key
|
||||
func SortByKey[GA ~[]T, K, T any](ord O.Ord[K], f func(T) K) func(ma GA) GA {
|
||||
|
||||
return func(ma GA) GA {
|
||||
// nothing to sort
|
||||
@@ -34,7 +40,7 @@ func Sort[GA ~[]T, T any](ord O.Ord[T]) func(ma GA) GA {
|
||||
cpy := make(GA, l)
|
||||
copy(cpy, ma)
|
||||
sort.Slice(cpy, func(i, j int) bool {
|
||||
return ord.Compare(cpy[i], cpy[j]) < 0
|
||||
return ord.Compare(f(cpy[i]), f(cpy[j])) < 0
|
||||
})
|
||||
return cpy
|
||||
}
|
||||
|
52
array/generic/zip.go
Normal file
52
array/generic/zip.go
Normal file
@@ -0,0 +1,52 @@
|
||||
// Copyright (c) 2023 IBM Corp.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package generic
|
||||
|
||||
import (
|
||||
F "github.com/IBM/fp-go/function"
|
||||
N "github.com/IBM/fp-go/number"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
)
|
||||
|
||||
// ZipWith applies a function to pairs of elements at the same index in two arrays, collecting the results in a new array. If one
|
||||
// input array is short, excess elements of the longer array are discarded.
|
||||
func ZipWith[AS ~[]A, BS ~[]B, CS ~[]C, FCT ~func(A, B) C, A, B, C any](fa AS, fb BS, f FCT) CS {
|
||||
l := N.Min(len(fa), len(fb))
|
||||
res := make(CS, l)
|
||||
for i := l - 1; i >= 0; i-- {
|
||||
res[i] = f(fa[i], fb[i])
|
||||
}
|
||||
return res
|
||||
}
|
||||
|
||||
// Zip takes two arrays and returns an array of corresponding pairs. If one input array is short, excess elements of the
|
||||
// longer array are discarded
|
||||
func Zip[AS ~[]A, BS ~[]B, 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])
|
||||
}
|
||||
|
||||
// Unzip is the function is reverse of [Zip]. Takes an array of pairs and return two corresponding arrays
|
||||
func Unzip[AS ~[]A, BS ~[]B, CS ~[]T.Tuple2[A, B], A, B any](cs CS) T.Tuple2[AS, BS] {
|
||||
l := len(cs)
|
||||
as := make(AS, l)
|
||||
bs := make(BS, l)
|
||||
for i := l - 1; i >= 0; i-- {
|
||||
t := cs[i]
|
||||
as[i] = t.F1
|
||||
bs[i] = t.F2
|
||||
}
|
||||
return T.MakeTuple2(as, bs)
|
||||
}
|
@@ -24,3 +24,8 @@ import (
|
||||
func Sort[T any](ord O.Ord[T]) func(ma []T) []T {
|
||||
return G.Sort[[]T](ord)
|
||||
}
|
||||
|
||||
// SortByKey implements a stable sort on the array given the provided ordering on an extracted key
|
||||
func SortByKey[K, T any](ord O.Ord[K], f func(T) K) func(ma []T) []T {
|
||||
return G.SortByKey[[]T](ord, f)
|
||||
}
|
||||
|
38
array/zip.go
Normal file
38
array/zip.go
Normal file
@@ -0,0 +1,38 @@
|
||||
// Copyright (c) 2023 IBM Corp.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package array
|
||||
|
||||
import (
|
||||
G "github.com/IBM/fp-go/array/generic"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
)
|
||||
|
||||
// ZipWith applies a function to pairs of elements at the same index in two arrays, collecting the results in a new array. If one
|
||||
// input array is short, excess elements of the longer array are discarded.
|
||||
func ZipWith[FCT ~func(A, B) C, A, B, C any](fa []A, fb []B, f FCT) []C {
|
||||
return G.ZipWith[[]A, []B, []C, FCT](fa, fb, f)
|
||||
}
|
||||
|
||||
// Zip takes two arrays and returns an array of corresponding pairs. If one input array is short, excess elements of the
|
||||
// longer array are discarded
|
||||
func Zip[A, B any](fb []B) func([]A) []T.Tuple2[A, B] {
|
||||
return G.Zip[[]A, []B, []T.Tuple2[A, B]](fb)
|
||||
}
|
||||
|
||||
// Unzip is the function is reverse of [Zip]. Takes an array of pairs and return two corresponding arrays
|
||||
func Unzip[A, B any](cs []T.Tuple2[A, B]) T.Tuple2[[]A, []B] {
|
||||
return G.Unzip[[]A, []B, []T.Tuple2[A, B]](cs)
|
||||
}
|
56
array/zip_test.go
Normal file
56
array/zip_test.go
Normal file
@@ -0,0 +1,56 @@
|
||||
// Copyright (c) 2023 IBM Corp.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package array
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestZipWith(t *testing.T) {
|
||||
left := From(1, 2, 3)
|
||||
right := From("a", "b", "c", "d")
|
||||
|
||||
res := ZipWith(left, right, func(l int, r string) string {
|
||||
return fmt.Sprintf("%s%d", r, l)
|
||||
})
|
||||
|
||||
assert.Equal(t, From("a1", "b2", "c3"), res)
|
||||
}
|
||||
|
||||
func TestZip(t *testing.T) {
|
||||
left := From(1, 2, 3)
|
||||
right := From("a", "b", "c", "d")
|
||||
|
||||
res := Zip[string](left)(right)
|
||||
|
||||
assert.Equal(t, From(T.MakeTuple2("a", 1), T.MakeTuple2("b", 2), T.MakeTuple2("c", 3)), res)
|
||||
}
|
||||
|
||||
func TestUnzip(t *testing.T) {
|
||||
left := From(1, 2, 3)
|
||||
right := From("a", "b", "c")
|
||||
|
||||
zipped := Zip[string](left)(right)
|
||||
|
||||
unzipped := Unzip(zipped)
|
||||
|
||||
assert.Equal(t, right, unzipped.F1)
|
||||
assert.Equal(t, left, unzipped.F2)
|
||||
}
|
@@ -17,7 +17,7 @@ package readerioeither
|
||||
|
||||
// Code generated by go generate; DO NOT EDIT.
|
||||
// This file was generated by robots at
|
||||
// 2023-07-28 15:42:22.8252325 +0200 CEST m=+0.010212601
|
||||
// 2023-07-28 22:48:20.012425 +0200 CEST m=+0.019517901
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
@@ -17,14 +17,14 @@ package generic
|
||||
|
||||
// Code generated by go generate; DO NOT EDIT.
|
||||
// This file was generated by robots at
|
||||
// 2023-07-28 15:42:22.8252325 +0200 CEST m=+0.010212601
|
||||
// 2023-07-28 22:48:20.012425 +0200 CEST m=+0.019517901
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
E "github.com/IBM/fp-go/either"
|
||||
RE "github.com/IBM/fp-go/readerioeither/generic"
|
||||
A "github.com/IBM/fp-go/internal/apply"
|
||||
RE "github.com/IBM/fp-go/readerioeither/generic"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
)
|
||||
|
||||
|
46
either/array.go
Normal file
46
either/array.go
Normal file
@@ -0,0 +1,46 @@
|
||||
// Copyright (c) 2023 IBM Corp.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package either
|
||||
|
||||
import (
|
||||
F "github.com/IBM/fp-go/function"
|
||||
RA "github.com/IBM/fp-go/internal/array"
|
||||
)
|
||||
|
||||
// TraverseArray transforms an array
|
||||
func TraverseArrayG[GA ~[]A, GB ~[]B, E, A, B any](f func(A) Either[E, B]) func(GA) Either[E, GB] {
|
||||
return RA.Traverse[GA](
|
||||
Of[E, GB],
|
||||
Map[E, GB, func(B) GB],
|
||||
Ap[GB, E, B],
|
||||
|
||||
f,
|
||||
)
|
||||
}
|
||||
|
||||
// TraverseArray transforms an array
|
||||
func TraverseArray[E, A, B any](f func(A) Either[E, B]) func([]A) Either[E, []B] {
|
||||
return TraverseArrayG[[]A, []B](f)
|
||||
}
|
||||
|
||||
func SequenceArrayG[GA ~[]A, GOA ~[]Either[E, A], E, A any](ma GOA) Either[E, GA] {
|
||||
return TraverseArrayG[GOA, GA](F.Identity[Either[E, A]])(ma)
|
||||
}
|
||||
|
||||
// SequenceArray converts a homogeneous sequence of either into an either of sequence
|
||||
func SequenceArray[E, A any](ma []Either[E, A]) Either[E, []A] {
|
||||
return SequenceArrayG[[]A](ma)
|
||||
}
|
@@ -15,10 +15,9 @@
|
||||
|
||||
// Code generated by go generate; DO NOT EDIT.
|
||||
// This file was generated by robots at
|
||||
// 2023-07-28 15:42:24.2984201 +0200 CEST m=+0.008649601
|
||||
// 2023-07-28 22:48:23.165015 +0200 CEST m=+0.038998801
|
||||
package either
|
||||
|
||||
|
||||
import (
|
||||
A "github.com/IBM/fp-go/internal/apply"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
@@ -77,7 +76,7 @@ func SequenceTuple1[E, T1 any](t T.Tuple1[Either[E, T1]]) Either[E, T.Tuple1[T1]
|
||||
}
|
||||
|
||||
// TraverseTuple1 converts a [Tuple1] of [A] via transformation functions transforming [A] to [Either[E, A]] into a [Either[E, Tuple1]].
|
||||
func TraverseTuple1[F1 ~func(A1) Either[E, T1], E, A1, T1 any](f1 F1) func (T.Tuple1[A1]) Either[E, T.Tuple1[T1]] {
|
||||
func TraverseTuple1[F1 ~func(A1) Either[E, T1], E, A1, T1 any](f1 F1) func(T.Tuple1[A1]) Either[E, T.Tuple1[T1]] {
|
||||
return func(t T.Tuple1[A1]) Either[E, T.Tuple1[T1]] {
|
||||
return A.TraverseTuple1(
|
||||
Map[E, T1, T.Tuple1[T1]],
|
||||
@@ -125,7 +124,7 @@ func SequenceTuple2[E, T1, T2 any](t T.Tuple2[Either[E, T1], Either[E, T2]]) Eit
|
||||
}
|
||||
|
||||
// TraverseTuple2 converts a [Tuple2] of [A] via transformation functions transforming [A] to [Either[E, A]] into a [Either[E, Tuple2]].
|
||||
func TraverseTuple2[F1 ~func(A1) Either[E, T1], F2 ~func(A2) Either[E, T2], E, A1, T1, A2, T2 any](f1 F1, f2 F2) func (T.Tuple2[A1, A2]) Either[E, T.Tuple2[T1, T2]] {
|
||||
func TraverseTuple2[F1 ~func(A1) Either[E, T1], F2 ~func(A2) Either[E, T2], E, A1, T1, A2, T2 any](f1 F1, f2 F2) func(T.Tuple2[A1, A2]) Either[E, T.Tuple2[T1, T2]] {
|
||||
return func(t T.Tuple2[A1, A2]) Either[E, T.Tuple2[T1, T2]] {
|
||||
return A.TraverseTuple2(
|
||||
Map[E, T1, func(T2) T.Tuple2[T1, T2]],
|
||||
@@ -178,7 +177,7 @@ func SequenceTuple3[E, T1, T2, T3 any](t T.Tuple3[Either[E, T1], Either[E, T2],
|
||||
}
|
||||
|
||||
// TraverseTuple3 converts a [Tuple3] of [A] via transformation functions transforming [A] to [Either[E, A]] into a [Either[E, Tuple3]].
|
||||
func TraverseTuple3[F1 ~func(A1) Either[E, T1], F2 ~func(A2) Either[E, T2], F3 ~func(A3) Either[E, T3], E, A1, T1, A2, T2, A3, T3 any](f1 F1, f2 F2, f3 F3) func (T.Tuple3[A1, A2, A3]) Either[E, T.Tuple3[T1, T2, T3]] {
|
||||
func TraverseTuple3[F1 ~func(A1) Either[E, T1], F2 ~func(A2) Either[E, T2], F3 ~func(A3) Either[E, T3], E, A1, T1, A2, T2, A3, T3 any](f1 F1, f2 F2, f3 F3) func(T.Tuple3[A1, A2, A3]) Either[E, T.Tuple3[T1, T2, T3]] {
|
||||
return func(t T.Tuple3[A1, A2, A3]) Either[E, T.Tuple3[T1, T2, T3]] {
|
||||
return A.TraverseTuple3(
|
||||
Map[E, T1, func(T2) func(T3) T.Tuple3[T1, T2, T3]],
|
||||
@@ -236,7 +235,7 @@ func SequenceTuple4[E, T1, T2, T3, T4 any](t T.Tuple4[Either[E, T1], Either[E, T
|
||||
}
|
||||
|
||||
// TraverseTuple4 converts a [Tuple4] of [A] via transformation functions transforming [A] to [Either[E, A]] into a [Either[E, Tuple4]].
|
||||
func TraverseTuple4[F1 ~func(A1) Either[E, T1], F2 ~func(A2) Either[E, T2], F3 ~func(A3) Either[E, T3], F4 ~func(A4) Either[E, T4], E, A1, T1, A2, T2, A3, T3, A4, T4 any](f1 F1, f2 F2, f3 F3, f4 F4) func (T.Tuple4[A1, A2, A3, A4]) Either[E, T.Tuple4[T1, T2, T3, T4]] {
|
||||
func TraverseTuple4[F1 ~func(A1) Either[E, T1], F2 ~func(A2) Either[E, T2], F3 ~func(A3) Either[E, T3], F4 ~func(A4) Either[E, T4], E, A1, T1, A2, T2, A3, T3, A4, T4 any](f1 F1, f2 F2, f3 F3, f4 F4) func(T.Tuple4[A1, A2, A3, A4]) Either[E, T.Tuple4[T1, T2, T3, T4]] {
|
||||
return func(t T.Tuple4[A1, A2, A3, A4]) Either[E, T.Tuple4[T1, T2, T3, T4]] {
|
||||
return A.TraverseTuple4(
|
||||
Map[E, T1, func(T2) func(T3) func(T4) T.Tuple4[T1, T2, T3, T4]],
|
||||
@@ -299,7 +298,7 @@ func SequenceTuple5[E, T1, T2, T3, T4, T5 any](t T.Tuple5[Either[E, T1], Either[
|
||||
}
|
||||
|
||||
// TraverseTuple5 converts a [Tuple5] of [A] via transformation functions transforming [A] to [Either[E, A]] into a [Either[E, Tuple5]].
|
||||
func TraverseTuple5[F1 ~func(A1) Either[E, T1], F2 ~func(A2) Either[E, T2], F3 ~func(A3) Either[E, T3], F4 ~func(A4) Either[E, T4], F5 ~func(A5) Either[E, T5], E, A1, T1, A2, T2, A3, T3, A4, T4, A5, T5 any](f1 F1, f2 F2, f3 F3, f4 F4, f5 F5) func (T.Tuple5[A1, A2, A3, A4, A5]) Either[E, T.Tuple5[T1, T2, T3, T4, T5]] {
|
||||
func TraverseTuple5[F1 ~func(A1) Either[E, T1], F2 ~func(A2) Either[E, T2], F3 ~func(A3) Either[E, T3], F4 ~func(A4) Either[E, T4], F5 ~func(A5) Either[E, T5], E, A1, T1, A2, T2, A3, T3, A4, T4, A5, T5 any](f1 F1, f2 F2, f3 F3, f4 F4, f5 F5) func(T.Tuple5[A1, A2, A3, A4, A5]) Either[E, T.Tuple5[T1, T2, T3, T4, T5]] {
|
||||
return func(t T.Tuple5[A1, A2, A3, A4, A5]) Either[E, T.Tuple5[T1, T2, T3, T4, T5]] {
|
||||
return A.TraverseTuple5(
|
||||
Map[E, T1, func(T2) func(T3) func(T4) func(T5) T.Tuple5[T1, T2, T3, T4, T5]],
|
||||
@@ -367,7 +366,7 @@ func SequenceTuple6[E, T1, T2, T3, T4, T5, T6 any](t T.Tuple6[Either[E, T1], Eit
|
||||
}
|
||||
|
||||
// TraverseTuple6 converts a [Tuple6] of [A] via transformation functions transforming [A] to [Either[E, A]] into a [Either[E, Tuple6]].
|
||||
func TraverseTuple6[F1 ~func(A1) Either[E, T1], F2 ~func(A2) Either[E, T2], F3 ~func(A3) Either[E, T3], F4 ~func(A4) Either[E, T4], F5 ~func(A5) Either[E, T5], F6 ~func(A6) Either[E, T6], E, A1, T1, A2, T2, A3, T3, A4, T4, A5, T5, A6, T6 any](f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6) func (T.Tuple6[A1, A2, A3, A4, A5, A6]) Either[E, T.Tuple6[T1, T2, T3, T4, T5, T6]] {
|
||||
func TraverseTuple6[F1 ~func(A1) Either[E, T1], F2 ~func(A2) Either[E, T2], F3 ~func(A3) Either[E, T3], F4 ~func(A4) Either[E, T4], F5 ~func(A5) Either[E, T5], F6 ~func(A6) Either[E, T6], E, A1, T1, A2, T2, A3, T3, A4, T4, A5, T5, A6, T6 any](f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6) func(T.Tuple6[A1, A2, A3, A4, A5, A6]) Either[E, T.Tuple6[T1, T2, T3, T4, T5, T6]] {
|
||||
return func(t T.Tuple6[A1, A2, A3, A4, A5, A6]) Either[E, T.Tuple6[T1, T2, T3, T4, T5, T6]] {
|
||||
return A.TraverseTuple6(
|
||||
Map[E, T1, func(T2) func(T3) func(T4) func(T5) func(T6) T.Tuple6[T1, T2, T3, T4, T5, T6]],
|
||||
@@ -440,7 +439,7 @@ func SequenceTuple7[E, T1, T2, T3, T4, T5, T6, T7 any](t T.Tuple7[Either[E, T1],
|
||||
}
|
||||
|
||||
// TraverseTuple7 converts a [Tuple7] of [A] via transformation functions transforming [A] to [Either[E, A]] into a [Either[E, Tuple7]].
|
||||
func TraverseTuple7[F1 ~func(A1) Either[E, T1], F2 ~func(A2) Either[E, T2], F3 ~func(A3) Either[E, T3], F4 ~func(A4) Either[E, T4], F5 ~func(A5) Either[E, T5], F6 ~func(A6) Either[E, T6], F7 ~func(A7) Either[E, T7], E, A1, T1, A2, T2, A3, T3, A4, T4, A5, T5, A6, T6, A7, T7 any](f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6, f7 F7) func (T.Tuple7[A1, A2, A3, A4, A5, A6, A7]) Either[E, T.Tuple7[T1, T2, T3, T4, T5, T6, T7]] {
|
||||
func TraverseTuple7[F1 ~func(A1) Either[E, T1], F2 ~func(A2) Either[E, T2], F3 ~func(A3) Either[E, T3], F4 ~func(A4) Either[E, T4], F5 ~func(A5) Either[E, T5], F6 ~func(A6) Either[E, T6], F7 ~func(A7) Either[E, T7], E, A1, T1, A2, T2, A3, T3, A4, T4, A5, T5, A6, T6, A7, T7 any](f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6, f7 F7) func(T.Tuple7[A1, A2, A3, A4, A5, A6, A7]) Either[E, T.Tuple7[T1, T2, T3, T4, T5, T6, T7]] {
|
||||
return func(t T.Tuple7[A1, A2, A3, A4, A5, A6, A7]) Either[E, T.Tuple7[T1, T2, T3, T4, T5, T6, T7]] {
|
||||
return A.TraverseTuple7(
|
||||
Map[E, T1, func(T2) func(T3) func(T4) func(T5) func(T6) func(T7) T.Tuple7[T1, T2, T3, T4, T5, T6, T7]],
|
||||
@@ -518,7 +517,7 @@ func SequenceTuple8[E, T1, T2, T3, T4, T5, T6, T7, T8 any](t T.Tuple8[Either[E,
|
||||
}
|
||||
|
||||
// TraverseTuple8 converts a [Tuple8] of [A] via transformation functions transforming [A] to [Either[E, A]] into a [Either[E, Tuple8]].
|
||||
func TraverseTuple8[F1 ~func(A1) Either[E, T1], F2 ~func(A2) Either[E, T2], F3 ~func(A3) Either[E, T3], F4 ~func(A4) Either[E, T4], F5 ~func(A5) Either[E, T5], F6 ~func(A6) Either[E, T6], F7 ~func(A7) Either[E, T7], F8 ~func(A8) Either[E, T8], E, A1, T1, A2, T2, A3, T3, A4, T4, A5, T5, A6, T6, A7, T7, A8, T8 any](f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6, f7 F7, f8 F8) func (T.Tuple8[A1, A2, A3, A4, A5, A6, A7, A8]) Either[E, T.Tuple8[T1, T2, T3, T4, T5, T6, T7, T8]] {
|
||||
func TraverseTuple8[F1 ~func(A1) Either[E, T1], F2 ~func(A2) Either[E, T2], F3 ~func(A3) Either[E, T3], F4 ~func(A4) Either[E, T4], F5 ~func(A5) Either[E, T5], F6 ~func(A6) Either[E, T6], F7 ~func(A7) Either[E, T7], F8 ~func(A8) Either[E, T8], E, A1, T1, A2, T2, A3, T3, A4, T4, A5, T5, A6, T6, A7, T7, A8, T8 any](f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6, f7 F7, f8 F8) func(T.Tuple8[A1, A2, A3, A4, A5, A6, A7, A8]) Either[E, T.Tuple8[T1, T2, T3, T4, T5, T6, T7, T8]] {
|
||||
return func(t T.Tuple8[A1, A2, A3, A4, A5, A6, A7, A8]) Either[E, T.Tuple8[T1, T2, T3, T4, T5, T6, T7, T8]] {
|
||||
return A.TraverseTuple8(
|
||||
Map[E, T1, func(T2) func(T3) func(T4) func(T5) func(T6) func(T7) func(T8) T.Tuple8[T1, T2, T3, T4, T5, T6, T7, T8]],
|
||||
@@ -601,7 +600,7 @@ func SequenceTuple9[E, T1, T2, T3, T4, T5, T6, T7, T8, T9 any](t T.Tuple9[Either
|
||||
}
|
||||
|
||||
// TraverseTuple9 converts a [Tuple9] of [A] via transformation functions transforming [A] to [Either[E, A]] into a [Either[E, Tuple9]].
|
||||
func TraverseTuple9[F1 ~func(A1) Either[E, T1], F2 ~func(A2) Either[E, T2], F3 ~func(A3) Either[E, T3], F4 ~func(A4) Either[E, T4], F5 ~func(A5) Either[E, T5], F6 ~func(A6) Either[E, T6], F7 ~func(A7) Either[E, T7], F8 ~func(A8) Either[E, T8], F9 ~func(A9) Either[E, T9], E, A1, T1, A2, T2, A3, T3, A4, T4, A5, T5, A6, T6, A7, T7, A8, T8, A9, T9 any](f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6, f7 F7, f8 F8, f9 F9) func (T.Tuple9[A1, A2, A3, A4, A5, A6, A7, A8, A9]) Either[E, T.Tuple9[T1, T2, T3, T4, T5, T6, T7, T8, T9]] {
|
||||
func TraverseTuple9[F1 ~func(A1) Either[E, T1], F2 ~func(A2) Either[E, T2], F3 ~func(A3) Either[E, T3], F4 ~func(A4) Either[E, T4], F5 ~func(A5) Either[E, T5], F6 ~func(A6) Either[E, T6], F7 ~func(A7) Either[E, T7], F8 ~func(A8) Either[E, T8], F9 ~func(A9) Either[E, T9], E, A1, T1, A2, T2, A3, T3, A4, T4, A5, T5, A6, T6, A7, T7, A8, T8, A9, T9 any](f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6, f7 F7, f8 F8, f9 F9) func(T.Tuple9[A1, A2, A3, A4, A5, A6, A7, A8, A9]) Either[E, T.Tuple9[T1, T2, T3, T4, T5, T6, T7, T8, T9]] {
|
||||
return func(t T.Tuple9[A1, A2, A3, A4, A5, A6, A7, A8, A9]) Either[E, T.Tuple9[T1, T2, T3, T4, T5, T6, T7, T8, T9]] {
|
||||
return A.TraverseTuple9(
|
||||
Map[E, T1, func(T2) func(T3) func(T4) func(T5) func(T6) func(T7) func(T8) func(T9) T.Tuple9[T1, T2, T3, T4, T5, T6, T7, T8, T9]],
|
||||
@@ -689,7 +688,7 @@ func SequenceTuple10[E, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10 any](t T.Tuple10
|
||||
}
|
||||
|
||||
// TraverseTuple10 converts a [Tuple10] of [A] via transformation functions transforming [A] to [Either[E, A]] into a [Either[E, Tuple10]].
|
||||
func TraverseTuple10[F1 ~func(A1) Either[E, T1], F2 ~func(A2) Either[E, T2], F3 ~func(A3) Either[E, T3], F4 ~func(A4) Either[E, T4], F5 ~func(A5) Either[E, T5], F6 ~func(A6) Either[E, T6], F7 ~func(A7) Either[E, T7], F8 ~func(A8) Either[E, T8], F9 ~func(A9) Either[E, T9], F10 ~func(A10) Either[E, T10], E, A1, T1, A2, T2, A3, T3, A4, T4, A5, T5, A6, T6, A7, T7, A8, T8, A9, T9, A10, T10 any](f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6, f7 F7, f8 F8, f9 F9, f10 F10) func (T.Tuple10[A1, A2, A3, A4, A5, A6, A7, A8, A9, A10]) Either[E, T.Tuple10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]] {
|
||||
func TraverseTuple10[F1 ~func(A1) Either[E, T1], F2 ~func(A2) Either[E, T2], F3 ~func(A3) Either[E, T3], F4 ~func(A4) Either[E, T4], F5 ~func(A5) Either[E, T5], F6 ~func(A6) Either[E, T6], F7 ~func(A7) Either[E, T7], F8 ~func(A8) Either[E, T8], F9 ~func(A9) Either[E, T9], F10 ~func(A10) Either[E, T10], E, A1, T1, A2, T2, A3, T3, A4, T4, A5, T5, A6, T6, A7, T7, A8, T8, A9, T9, A10, T10 any](f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6, f7 F7, f8 F8, f9 F9, f10 F10) func(T.Tuple10[A1, A2, A3, A4, A5, A6, A7, A8, A9, A10]) Either[E, T.Tuple10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]] {
|
||||
return func(t T.Tuple10[A1, A2, A3, A4, A5, A6, A7, A8, A9, A10]) Either[E, T.Tuple10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]] {
|
||||
return A.TraverseTuple10(
|
||||
Map[E, T1, func(T2) func(T3) func(T4) func(T5) func(T6) func(T7) func(T8) func(T9) func(T10) T.Tuple10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]],
|
||||
|
@@ -21,16 +21,12 @@ import (
|
||||
S "github.com/IBM/fp-go/semigroup"
|
||||
)
|
||||
|
||||
func concat[A any](first, second func(A) A) func(A) A {
|
||||
return F.Flow2(first, second)
|
||||
}
|
||||
|
||||
// Semigroup for the Endomorphism where the `concat` operation is the usual function composition.
|
||||
func Semigroup[A any]() S.Semigroup[func(A) A] {
|
||||
return S.MakeSemigroup(concat[A])
|
||||
return S.MakeSemigroup(F.Flow2[func(A) A, func(A) A])
|
||||
}
|
||||
|
||||
// Monoid for the Endomorphism where the `concat` operation is the usual function composition.
|
||||
func Monoid[A any]() M.Monoid[func(A) A] {
|
||||
return M.MakeMonoid(concat[A], F.Identity[A])
|
||||
return M.MakeMonoid(F.Flow2[func(A) A, func(A) A], F.Identity[A])
|
||||
}
|
||||
|
23
file/getters.go
Normal file
23
file/getters.go
Normal file
@@ -0,0 +1,23 @@
|
||||
// Copyright (c) 2023 IBM Corp.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package file
|
||||
|
||||
import "os"
|
||||
|
||||
// GetName is the getter for the `Name` property of [os.File]
|
||||
func GetName(f *os.File) string {
|
||||
return f.Name()
|
||||
}
|
@@ -15,8 +15,9 @@
|
||||
|
||||
// Code generated by go generate; DO NOT EDIT.
|
||||
// This file was generated by robots at
|
||||
// 2023-07-28 15:42:51.4021911 +0200 CEST m=+0.009058101
|
||||
// 2023-07-28 22:48:40.161663 +0200 CEST m=+0.009458101
|
||||
package function
|
||||
|
||||
// Combinations for a total of 1 arguments
|
||||
|
||||
// Bind1of1 takes a function with 1 parameters and returns a new function with 1 parameters that will bind these parameters to the positions [1] of the original function.
|
||||
@@ -35,6 +36,7 @@ func Ignore1of1[T1 any, F ~func() R, R any](f F) func(T1) R {
|
||||
return f()
|
||||
}
|
||||
}
|
||||
|
||||
// Combinations for a total of 2 arguments
|
||||
|
||||
// Bind1of2 takes a function with 2 parameters and returns a new function with 1 parameters that will bind these parameters to the positions [1] of the original function.
|
||||
@@ -87,6 +89,7 @@ func Ignore12of2[T1, T2 any, F ~func() R, R any](f F) func(T1, T2) R {
|
||||
return f()
|
||||
}
|
||||
}
|
||||
|
||||
// Combinations for a total of 3 arguments
|
||||
|
||||
// Bind1of3 takes a function with 3 parameters and returns a new function with 1 parameters that will bind these parameters to the positions [1] of the original function.
|
||||
@@ -207,6 +210,7 @@ func Ignore123of3[T1, T2, T3 any, F ~func() R, R any](f F) func(T1, T2, T3) R {
|
||||
return f()
|
||||
}
|
||||
}
|
||||
|
||||
// Combinations for a total of 4 arguments
|
||||
|
||||
// Bind1of4 takes a function with 4 parameters and returns a new function with 1 parameters that will bind these parameters to the positions [1] of the original function.
|
||||
|
@@ -15,7 +15,7 @@
|
||||
|
||||
// Code generated by go generate; DO NOT EDIT.
|
||||
// This file was generated by robots at
|
||||
// 2023-07-28 15:42:43.1490717 +0200 CEST m=+0.010222401
|
||||
// 2023-07-28 22:48:27.8029852 +0200 CEST m=+0.051432001
|
||||
package function
|
||||
|
||||
// Pipe0 takes an initial value t0 and successively applies 0 functions where the input of a function is the return value of the previous function
|
||||
@@ -30,12 +30,14 @@ func Variadic0[V, R any](f func([]V) R) func(...V) R {
|
||||
return f(v)
|
||||
}
|
||||
}
|
||||
|
||||
// Unvariadic0 converts a function taking 0 parameters and a final variadic argument into a function with 0 parameters but a final slice argument
|
||||
func Unvariadic0[V, R any](f func(...V) R) func([]V) R {
|
||||
return func(v []V) R {
|
||||
return f(v...)
|
||||
}
|
||||
}
|
||||
|
||||
// Pipe1 takes an initial value t0 and successively applies 1 functions where the input of a function is the return value of the previous function
|
||||
// The final return value is the result of the last function application
|
||||
func Pipe1[F1 ~func(T0) T1, T0, T1 any](t0 T0, f1 F1) T1 {
|
||||
@@ -80,12 +82,14 @@ func Variadic1[T1, V, R any](f func(T1, []V) R) func(T1, ...V) R {
|
||||
return f(t1, v)
|
||||
}
|
||||
}
|
||||
|
||||
// Unvariadic1 converts a function taking 1 parameters and a final variadic argument into a function with 1 parameters but a final slice argument
|
||||
func Unvariadic1[T1, V, R any](f func(T1, ...V) R) func(T1, []V) R {
|
||||
return func(t1 T1, v []V) R {
|
||||
return f(t1, v...)
|
||||
}
|
||||
}
|
||||
|
||||
// Pipe2 takes an initial value t0 and successively applies 2 functions where the input of a function is the return value of the previous function
|
||||
// The final return value is the result of the last function application
|
||||
func Pipe2[F1 ~func(T0) T1, F2 ~func(T1) T2, T0, T1, T2 any](t0 T0, f1 F1, f2 F2) T2 {
|
||||
@@ -133,12 +137,14 @@ func Variadic2[T1, T2, V, R any](f func(T1, T2, []V) R) func(T1, T2, ...V) R {
|
||||
return f(t1, t2, v)
|
||||
}
|
||||
}
|
||||
|
||||
// Unvariadic2 converts a function taking 2 parameters and a final variadic argument into a function with 2 parameters but a final slice argument
|
||||
func Unvariadic2[T1, T2, V, R any](f func(T1, T2, ...V) R) func(T1, T2, []V) R {
|
||||
return func(t1 T1, t2 T2, v []V) R {
|
||||
return f(t1, t2, v...)
|
||||
}
|
||||
}
|
||||
|
||||
// Pipe3 takes an initial value t0 and successively applies 3 functions where the input of a function is the return value of the previous function
|
||||
// The final return value is the result of the last function application
|
||||
func Pipe3[F1 ~func(T0) T1, F2 ~func(T1) T2, F3 ~func(T2) T3, T0, T1, T2, T3 any](t0 T0, f1 F1, f2 F2, f3 F3) T3 {
|
||||
@@ -189,12 +195,14 @@ func Variadic3[T1, T2, T3, V, R any](f func(T1, T2, T3, []V) R) func(T1, T2, T3,
|
||||
return f(t1, t2, t3, v)
|
||||
}
|
||||
}
|
||||
|
||||
// Unvariadic3 converts a function taking 3 parameters and a final variadic argument into a function with 3 parameters but a final slice argument
|
||||
func Unvariadic3[T1, T2, T3, V, R any](f func(T1, T2, T3, ...V) R) func(T1, T2, T3, []V) R {
|
||||
return func(t1 T1, t2 T2, t3 T3, v []V) R {
|
||||
return f(t1, t2, t3, v...)
|
||||
}
|
||||
}
|
||||
|
||||
// Pipe4 takes an initial value t0 and successively applies 4 functions where the input of a function is the return value of the previous function
|
||||
// The final return value is the result of the last function application
|
||||
func Pipe4[F1 ~func(T0) T1, F2 ~func(T1) T2, F3 ~func(T2) T3, F4 ~func(T3) T4, T0, T1, T2, T3, T4 any](t0 T0, f1 F1, f2 F2, f3 F3, f4 F4) T4 {
|
||||
@@ -248,12 +256,14 @@ func Variadic4[T1, T2, T3, T4, V, R any](f func(T1, T2, T3, T4, []V) R) func(T1,
|
||||
return f(t1, t2, t3, t4, v)
|
||||
}
|
||||
}
|
||||
|
||||
// Unvariadic4 converts a function taking 4 parameters and a final variadic argument into a function with 4 parameters but a final slice argument
|
||||
func Unvariadic4[T1, T2, T3, T4, V, R any](f func(T1, T2, T3, T4, ...V) R) func(T1, T2, T3, T4, []V) R {
|
||||
return func(t1 T1, t2 T2, t3 T3, t4 T4, v []V) R {
|
||||
return f(t1, t2, t3, t4, v...)
|
||||
}
|
||||
}
|
||||
|
||||
// Pipe5 takes an initial value t0 and successively applies 5 functions where the input of a function is the return value of the previous function
|
||||
// The final return value is the result of the last function application
|
||||
func Pipe5[F1 ~func(T0) T1, F2 ~func(T1) T2, F3 ~func(T2) T3, F4 ~func(T3) T4, F5 ~func(T4) T5, T0, T1, T2, T3, T4, T5 any](t0 T0, f1 F1, f2 F2, f3 F3, f4 F4, f5 F5) T5 {
|
||||
@@ -310,12 +320,14 @@ func Variadic5[T1, T2, T3, T4, T5, V, R any](f func(T1, T2, T3, T4, T5, []V) R)
|
||||
return f(t1, t2, t3, t4, t5, v)
|
||||
}
|
||||
}
|
||||
|
||||
// Unvariadic5 converts a function taking 5 parameters and a final variadic argument into a function with 5 parameters but a final slice argument
|
||||
func Unvariadic5[T1, T2, T3, T4, T5, V, R any](f func(T1, T2, T3, T4, T5, ...V) R) func(T1, T2, T3, T4, T5, []V) R {
|
||||
return func(t1 T1, t2 T2, t3 T3, t4 T4, t5 T5, v []V) R {
|
||||
return f(t1, t2, t3, t4, t5, v...)
|
||||
}
|
||||
}
|
||||
|
||||
// Pipe6 takes an initial value t0 and successively applies 6 functions where the input of a function is the return value of the previous function
|
||||
// The final return value is the result of the last function application
|
||||
func Pipe6[F1 ~func(T0) T1, F2 ~func(T1) T2, F3 ~func(T2) T3, F4 ~func(T3) T4, F5 ~func(T4) T5, F6 ~func(T5) T6, T0, T1, T2, T3, T4, T5, T6 any](t0 T0, f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6) T6 {
|
||||
@@ -375,12 +387,14 @@ func Variadic6[T1, T2, T3, T4, T5, T6, V, R any](f func(T1, T2, T3, T4, T5, T6,
|
||||
return f(t1, t2, t3, t4, t5, t6, v)
|
||||
}
|
||||
}
|
||||
|
||||
// Unvariadic6 converts a function taking 6 parameters and a final variadic argument into a function with 6 parameters but a final slice argument
|
||||
func Unvariadic6[T1, T2, T3, T4, T5, T6, V, R any](f func(T1, T2, T3, T4, T5, T6, ...V) R) func(T1, T2, T3, T4, T5, T6, []V) R {
|
||||
return func(t1 T1, t2 T2, t3 T3, t4 T4, t5 T5, t6 T6, v []V) R {
|
||||
return f(t1, t2, t3, t4, t5, t6, v...)
|
||||
}
|
||||
}
|
||||
|
||||
// Pipe7 takes an initial value t0 and successively applies 7 functions where the input of a function is the return value of the previous function
|
||||
// The final return value is the result of the last function application
|
||||
func Pipe7[F1 ~func(T0) T1, F2 ~func(T1) T2, F3 ~func(T2) T3, F4 ~func(T3) T4, F5 ~func(T4) T5, F6 ~func(T5) T6, F7 ~func(T6) T7, T0, T1, T2, T3, T4, T5, T6, T7 any](t0 T0, f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6, f7 F7) T7 {
|
||||
@@ -443,12 +457,14 @@ func Variadic7[T1, T2, T3, T4, T5, T6, T7, V, R any](f func(T1, T2, T3, T4, T5,
|
||||
return f(t1, t2, t3, t4, t5, t6, t7, v)
|
||||
}
|
||||
}
|
||||
|
||||
// Unvariadic7 converts a function taking 7 parameters and a final variadic argument into a function with 7 parameters but a final slice argument
|
||||
func Unvariadic7[T1, T2, T3, T4, T5, T6, T7, V, R any](f func(T1, T2, T3, T4, T5, T6, T7, ...V) R) func(T1, T2, T3, T4, T5, T6, T7, []V) R {
|
||||
return func(t1 T1, t2 T2, t3 T3, t4 T4, t5 T5, t6 T6, t7 T7, v []V) R {
|
||||
return f(t1, t2, t3, t4, t5, t6, t7, v...)
|
||||
}
|
||||
}
|
||||
|
||||
// Pipe8 takes an initial value t0 and successively applies 8 functions where the input of a function is the return value of the previous function
|
||||
// The final return value is the result of the last function application
|
||||
func Pipe8[F1 ~func(T0) T1, F2 ~func(T1) T2, F3 ~func(T2) T3, F4 ~func(T3) T4, F5 ~func(T4) T5, F6 ~func(T5) T6, F7 ~func(T6) T7, F8 ~func(T7) T8, T0, T1, T2, T3, T4, T5, T6, T7, T8 any](t0 T0, f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6, f7 F7, f8 F8) T8 {
|
||||
@@ -514,12 +530,14 @@ func Variadic8[T1, T2, T3, T4, T5, T6, T7, T8, V, R any](f func(T1, T2, T3, T4,
|
||||
return f(t1, t2, t3, t4, t5, t6, t7, t8, v)
|
||||
}
|
||||
}
|
||||
|
||||
// Unvariadic8 converts a function taking 8 parameters and a final variadic argument into a function with 8 parameters but a final slice argument
|
||||
func Unvariadic8[T1, T2, T3, T4, T5, T6, T7, T8, V, R any](f func(T1, T2, T3, T4, T5, T6, T7, T8, ...V) R) func(T1, T2, T3, T4, T5, T6, T7, T8, []V) R {
|
||||
return func(t1 T1, t2 T2, t3 T3, t4 T4, t5 T5, t6 T6, t7 T7, t8 T8, v []V) R {
|
||||
return f(t1, t2, t3, t4, t5, t6, t7, t8, v...)
|
||||
}
|
||||
}
|
||||
|
||||
// Pipe9 takes an initial value t0 and successively applies 9 functions where the input of a function is the return value of the previous function
|
||||
// The final return value is the result of the last function application
|
||||
func Pipe9[F1 ~func(T0) T1, F2 ~func(T1) T2, F3 ~func(T2) T3, F4 ~func(T3) T4, F5 ~func(T4) T5, F6 ~func(T5) T6, F7 ~func(T6) T7, F8 ~func(T7) T8, F9 ~func(T8) T9, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9 any](t0 T0, f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6, f7 F7, f8 F8, f9 F9) T9 {
|
||||
@@ -588,12 +606,14 @@ func Variadic9[T1, T2, T3, T4, T5, T6, T7, T8, T9, V, R any](f func(T1, T2, T3,
|
||||
return f(t1, t2, t3, t4, t5, t6, t7, t8, t9, v)
|
||||
}
|
||||
}
|
||||
|
||||
// Unvariadic9 converts a function taking 9 parameters and a final variadic argument into a function with 9 parameters but a final slice argument
|
||||
func Unvariadic9[T1, T2, T3, T4, T5, T6, T7, T8, T9, V, R any](f func(T1, T2, T3, T4, T5, T6, T7, T8, T9, ...V) R) func(T1, T2, T3, T4, T5, T6, T7, T8, T9, []V) R {
|
||||
return func(t1 T1, t2 T2, t3 T3, t4 T4, t5 T5, t6 T6, t7 T7, t8 T8, t9 T9, v []V) R {
|
||||
return f(t1, t2, t3, t4, t5, t6, t7, t8, t9, v...)
|
||||
}
|
||||
}
|
||||
|
||||
// Pipe10 takes an initial value t0 and successively applies 10 functions where the input of a function is the return value of the previous function
|
||||
// The final return value is the result of the last function application
|
||||
func Pipe10[F1 ~func(T0) T1, F2 ~func(T1) T2, F3 ~func(T2) T3, F4 ~func(T3) T4, F5 ~func(T4) T5, F6 ~func(T5) T6, F7 ~func(T6) T7, F8 ~func(T7) T8, F9 ~func(T8) T9, F10 ~func(T9) T10, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10 any](t0 T0, f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6, f7 F7, f8 F8, f9 F9, f10 F10) T10 {
|
||||
@@ -665,12 +685,14 @@ func Variadic10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, V, R any](f func(T1, T2
|
||||
return f(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, v)
|
||||
}
|
||||
}
|
||||
|
||||
// Unvariadic10 converts a function taking 10 parameters and a final variadic argument into a function with 10 parameters but a final slice argument
|
||||
func Unvariadic10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, V, R any](f func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, ...V) R) func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, []V) R {
|
||||
return func(t1 T1, t2 T2, t3 T3, t4 T4, t5 T5, t6 T6, t7 T7, t8 T8, t9 T9, t10 T10, v []V) R {
|
||||
return f(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, v...)
|
||||
}
|
||||
}
|
||||
|
||||
// Pipe11 takes an initial value t0 and successively applies 11 functions where the input of a function is the return value of the previous function
|
||||
// The final return value is the result of the last function application
|
||||
func Pipe11[F1 ~func(T0) T1, F2 ~func(T1) T2, F3 ~func(T2) T3, F4 ~func(T3) T4, F5 ~func(T4) T5, F6 ~func(T5) T6, F7 ~func(T6) T7, F8 ~func(T7) T8, F9 ~func(T8) T9, F10 ~func(T9) T10, F11 ~func(T10) T11, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11 any](t0 T0, f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6, f7 F7, f8 F8, f9 F9, f10 F10, f11 F11) T11 {
|
||||
@@ -745,12 +767,14 @@ func Variadic11[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, V, R any](f func(T
|
||||
return f(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, v)
|
||||
}
|
||||
}
|
||||
|
||||
// Unvariadic11 converts a function taking 11 parameters and a final variadic argument into a function with 11 parameters but a final slice argument
|
||||
func Unvariadic11[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, V, R any](f func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, ...V) R) func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, []V) R {
|
||||
return func(t1 T1, t2 T2, t3 T3, t4 T4, t5 T5, t6 T6, t7 T7, t8 T8, t9 T9, t10 T10, t11 T11, v []V) R {
|
||||
return f(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, v...)
|
||||
}
|
||||
}
|
||||
|
||||
// Pipe12 takes an initial value t0 and successively applies 12 functions where the input of a function is the return value of the previous function
|
||||
// The final return value is the result of the last function application
|
||||
func Pipe12[F1 ~func(T0) T1, F2 ~func(T1) T2, F3 ~func(T2) T3, F4 ~func(T3) T4, F5 ~func(T4) T5, F6 ~func(T5) T6, F7 ~func(T6) T7, F8 ~func(T7) T8, F9 ~func(T8) T9, F10 ~func(T9) T10, F11 ~func(T10) T11, F12 ~func(T11) T12, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12 any](t0 T0, f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6, f7 F7, f8 F8, f9 F9, f10 F10, f11 F11, f12 F12) T12 {
|
||||
@@ -828,12 +852,14 @@ func Variadic12[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, V, R any](f f
|
||||
return f(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, v)
|
||||
}
|
||||
}
|
||||
|
||||
// Unvariadic12 converts a function taking 12 parameters and a final variadic argument into a function with 12 parameters but a final slice argument
|
||||
func Unvariadic12[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, V, R any](f func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, ...V) R) func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, []V) R {
|
||||
return func(t1 T1, t2 T2, t3 T3, t4 T4, t5 T5, t6 T6, t7 T7, t8 T8, t9 T9, t10 T10, t11 T11, t12 T12, v []V) R {
|
||||
return f(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, v...)
|
||||
}
|
||||
}
|
||||
|
||||
// Pipe13 takes an initial value t0 and successively applies 13 functions where the input of a function is the return value of the previous function
|
||||
// The final return value is the result of the last function application
|
||||
func Pipe13[F1 ~func(T0) T1, F2 ~func(T1) T2, F3 ~func(T2) T3, F4 ~func(T3) T4, F5 ~func(T4) T5, F6 ~func(T5) T6, F7 ~func(T6) T7, F8 ~func(T7) T8, F9 ~func(T8) T9, F10 ~func(T9) T10, F11 ~func(T10) T11, F12 ~func(T11) T12, F13 ~func(T12) T13, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13 any](t0 T0, f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6, f7 F7, f8 F8, f9 F9, f10 F10, f11 F11, f12 F12, f13 F13) T13 {
|
||||
@@ -914,12 +940,14 @@ func Variadic13[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, V, R any
|
||||
return f(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, v)
|
||||
}
|
||||
}
|
||||
|
||||
// Unvariadic13 converts a function taking 13 parameters and a final variadic argument into a function with 13 parameters but a final slice argument
|
||||
func Unvariadic13[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, V, R any](f func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, ...V) R) func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, []V) R {
|
||||
return func(t1 T1, t2 T2, t3 T3, t4 T4, t5 T5, t6 T6, t7 T7, t8 T8, t9 T9, t10 T10, t11 T11, t12 T12, t13 T13, v []V) R {
|
||||
return f(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, v...)
|
||||
}
|
||||
}
|
||||
|
||||
// Pipe14 takes an initial value t0 and successively applies 14 functions where the input of a function is the return value of the previous function
|
||||
// The final return value is the result of the last function application
|
||||
func Pipe14[F1 ~func(T0) T1, F2 ~func(T1) T2, F3 ~func(T2) T3, F4 ~func(T3) T4, F5 ~func(T4) T5, F6 ~func(T5) T6, F7 ~func(T6) T7, F8 ~func(T7) T8, F9 ~func(T8) T9, F10 ~func(T9) T10, F11 ~func(T10) T11, F12 ~func(T11) T12, F13 ~func(T12) T13, F14 ~func(T13) T14, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14 any](t0 T0, f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6, f7 F7, f8 F8, f9 F9, f10 F10, f11 F11, f12 F12, f13 F13, f14 F14) T14 {
|
||||
@@ -1003,12 +1031,14 @@ func Variadic14[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, V,
|
||||
return f(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, v)
|
||||
}
|
||||
}
|
||||
|
||||
// Unvariadic14 converts a function taking 14 parameters and a final variadic argument into a function with 14 parameters but a final slice argument
|
||||
func Unvariadic14[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, V, R any](f func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, ...V) R) func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, []V) R {
|
||||
return func(t1 T1, t2 T2, t3 T3, t4 T4, t5 T5, t6 T6, t7 T7, t8 T8, t9 T9, t10 T10, t11 T11, t12 T12, t13 T13, t14 T14, v []V) R {
|
||||
return f(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, v...)
|
||||
}
|
||||
}
|
||||
|
||||
// Pipe15 takes an initial value t0 and successively applies 15 functions where the input of a function is the return value of the previous function
|
||||
// The final return value is the result of the last function application
|
||||
func Pipe15[F1 ~func(T0) T1, F2 ~func(T1) T2, F3 ~func(T2) T3, F4 ~func(T3) T4, F5 ~func(T4) T5, F6 ~func(T5) T6, F7 ~func(T6) T7, F8 ~func(T7) T8, F9 ~func(T8) T9, F10 ~func(T9) T10, F11 ~func(T10) T11, F12 ~func(T11) T12, F13 ~func(T12) T13, F14 ~func(T13) T14, F15 ~func(T14) T15, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15 any](t0 T0, f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6, f7 F7, f8 F8, f9 F9, f10 F10, f11 F11, f12 F12, f13 F13, f14 F14, f15 F15) T15 {
|
||||
@@ -1095,12 +1125,14 @@ func Variadic15[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15
|
||||
return f(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, v)
|
||||
}
|
||||
}
|
||||
|
||||
// Unvariadic15 converts a function taking 15 parameters and a final variadic argument into a function with 15 parameters but a final slice argument
|
||||
func Unvariadic15[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, V, R any](f func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, ...V) R) func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, []V) R {
|
||||
return func(t1 T1, t2 T2, t3 T3, t4 T4, t5 T5, t6 T6, t7 T7, t8 T8, t9 T9, t10 T10, t11 T11, t12 T12, t13 T13, t14 T14, t15 T15, v []V) R {
|
||||
return f(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, v...)
|
||||
}
|
||||
}
|
||||
|
||||
// Pipe16 takes an initial value t0 and successively applies 16 functions where the input of a function is the return value of the previous function
|
||||
// The final return value is the result of the last function application
|
||||
func Pipe16[F1 ~func(T0) T1, F2 ~func(T1) T2, F3 ~func(T2) T3, F4 ~func(T3) T4, F5 ~func(T4) T5, F6 ~func(T5) T6, F7 ~func(T6) T7, F8 ~func(T7) T8, F9 ~func(T8) T9, F10 ~func(T9) T10, F11 ~func(T10) T11, F12 ~func(T11) T12, F13 ~func(T12) T13, F14 ~func(T13) T14, F15 ~func(T14) T15, F16 ~func(T15) T16, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16 any](t0 T0, f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6, f7 F7, f8 F8, f9 F9, f10 F10, f11 F11, f12 F12, f13 F13, f14 F14, f15 F15, f16 F16) T16 {
|
||||
@@ -1190,12 +1222,14 @@ func Variadic16[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15
|
||||
return f(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, v)
|
||||
}
|
||||
}
|
||||
|
||||
// Unvariadic16 converts a function taking 16 parameters and a final variadic argument into a function with 16 parameters but a final slice argument
|
||||
func Unvariadic16[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, V, R any](f func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, ...V) R) func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, []V) R {
|
||||
return func(t1 T1, t2 T2, t3 T3, t4 T4, t5 T5, t6 T6, t7 T7, t8 T8, t9 T9, t10 T10, t11 T11, t12 T12, t13 T13, t14 T14, t15 T15, t16 T16, v []V) R {
|
||||
return f(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, v...)
|
||||
}
|
||||
}
|
||||
|
||||
// Pipe17 takes an initial value t0 and successively applies 17 functions where the input of a function is the return value of the previous function
|
||||
// The final return value is the result of the last function application
|
||||
func Pipe17[F1 ~func(T0) T1, F2 ~func(T1) T2, F3 ~func(T2) T3, F4 ~func(T3) T4, F5 ~func(T4) T5, F6 ~func(T5) T6, F7 ~func(T6) T7, F8 ~func(T7) T8, F9 ~func(T8) T9, F10 ~func(T9) T10, F11 ~func(T10) T11, F12 ~func(T11) T12, F13 ~func(T12) T13, F14 ~func(T13) T14, F15 ~func(T14) T15, F16 ~func(T15) T16, F17 ~func(T16) T17, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17 any](t0 T0, f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6, f7 F7, f8 F8, f9 F9, f10 F10, f11 F11, f12 F12, f13 F13, f14 F14, f15 F15, f16 F16, f17 F17) T17 {
|
||||
@@ -1288,12 +1322,14 @@ func Variadic17[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15
|
||||
return f(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17, v)
|
||||
}
|
||||
}
|
||||
|
||||
// Unvariadic17 converts a function taking 17 parameters and a final variadic argument into a function with 17 parameters but a final slice argument
|
||||
func Unvariadic17[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, V, R any](f func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, ...V) R) func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, []V) R {
|
||||
return func(t1 T1, t2 T2, t3 T3, t4 T4, t5 T5, t6 T6, t7 T7, t8 T8, t9 T9, t10 T10, t11 T11, t12 T12, t13 T13, t14 T14, t15 T15, t16 T16, t17 T17, v []V) R {
|
||||
return f(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17, v...)
|
||||
}
|
||||
}
|
||||
|
||||
// Pipe18 takes an initial value t0 and successively applies 18 functions where the input of a function is the return value of the previous function
|
||||
// The final return value is the result of the last function application
|
||||
func Pipe18[F1 ~func(T0) T1, F2 ~func(T1) T2, F3 ~func(T2) T3, F4 ~func(T3) T4, F5 ~func(T4) T5, F6 ~func(T5) T6, F7 ~func(T6) T7, F8 ~func(T7) T8, F9 ~func(T8) T9, F10 ~func(T9) T10, F11 ~func(T10) T11, F12 ~func(T11) T12, F13 ~func(T12) T13, F14 ~func(T13) T14, F15 ~func(T14) T15, F16 ~func(T15) T16, F17 ~func(T16) T17, F18 ~func(T17) T18, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18 any](t0 T0, f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6, f7 F7, f8 F8, f9 F9, f10 F10, f11 F11, f12 F12, f13 F13, f14 F14, f15 F15, f16 F16, f17 F17, f18 F18) T18 {
|
||||
@@ -1389,12 +1425,14 @@ func Variadic18[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15
|
||||
return f(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17, t18, v)
|
||||
}
|
||||
}
|
||||
|
||||
// Unvariadic18 converts a function taking 18 parameters and a final variadic argument into a function with 18 parameters but a final slice argument
|
||||
func Unvariadic18[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, V, R any](f func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, ...V) R) func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, []V) R {
|
||||
return func(t1 T1, t2 T2, t3 T3, t4 T4, t5 T5, t6 T6, t7 T7, t8 T8, t9 T9, t10 T10, t11 T11, t12 T12, t13 T13, t14 T14, t15 T15, t16 T16, t17 T17, t18 T18, v []V) R {
|
||||
return f(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17, t18, v...)
|
||||
}
|
||||
}
|
||||
|
||||
// Pipe19 takes an initial value t0 and successively applies 19 functions where the input of a function is the return value of the previous function
|
||||
// The final return value is the result of the last function application
|
||||
func Pipe19[F1 ~func(T0) T1, F2 ~func(T1) T2, F3 ~func(T2) T3, F4 ~func(T3) T4, F5 ~func(T4) T5, F6 ~func(T5) T6, F7 ~func(T6) T7, F8 ~func(T7) T8, F9 ~func(T8) T9, F10 ~func(T9) T10, F11 ~func(T10) T11, F12 ~func(T11) T12, F13 ~func(T12) T13, F14 ~func(T13) T14, F15 ~func(T14) T15, F16 ~func(T15) T16, F17 ~func(T16) T17, F18 ~func(T17) T18, F19 ~func(T18) T19, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19 any](t0 T0, f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6, f7 F7, f8 F8, f9 F9, f10 F10, f11 F11, f12 F12, f13 F13, f14 F14, f15 F15, f16 F16, f17 F17, f18 F18, f19 F19) T19 {
|
||||
@@ -1493,12 +1531,14 @@ func Variadic19[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15
|
||||
return f(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17, t18, t19, v)
|
||||
}
|
||||
}
|
||||
|
||||
// Unvariadic19 converts a function taking 19 parameters and a final variadic argument into a function with 19 parameters but a final slice argument
|
||||
func Unvariadic19[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, V, R any](f func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, ...V) R) func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, []V) R {
|
||||
return func(t1 T1, t2 T2, t3 T3, t4 T4, t5 T5, t6 T6, t7 T7, t8 T8, t9 T9, t10 T10, t11 T11, t12 T12, t13 T13, t14 T14, t15 T15, t16 T16, t17 T17, t18 T18, t19 T19, v []V) R {
|
||||
return f(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17, t18, t19, v...)
|
||||
}
|
||||
}
|
||||
|
||||
// Pipe20 takes an initial value t0 and successively applies 20 functions where the input of a function is the return value of the previous function
|
||||
// The final return value is the result of the last function application
|
||||
func Pipe20[F1 ~func(T0) T1, F2 ~func(T1) T2, F3 ~func(T2) T3, F4 ~func(T3) T4, F5 ~func(T4) T5, F6 ~func(T5) T6, F7 ~func(T6) T7, F8 ~func(T7) T8, F9 ~func(T8) T9, F10 ~func(T9) T10, F11 ~func(T10) T11, F12 ~func(T11) T12, F13 ~func(T12) T13, F14 ~func(T13) T14, F15 ~func(T14) T15, F16 ~func(T15) T16, F17 ~func(T16) T17, F18 ~func(T17) T18, F19 ~func(T18) T19, F20 ~func(T19) T20, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20 any](t0 T0, f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6, f7 F7, f8 F8, f9 F9, f10 F10, f11 F11, f12 F12, f13 F13, f14 F14, f15 F15, f16 F16, f17 F17, f18 F18, f19 F19, f20 F20) T20 {
|
||||
@@ -1600,6 +1640,7 @@ func Variadic20[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15
|
||||
return f(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15, t16, t17, t18, t19, t20, v)
|
||||
}
|
||||
}
|
||||
|
||||
// Unvariadic20 converts a function taking 20 parameters and a final variadic argument into a function with 20 parameters but a final slice argument
|
||||
func Unvariadic20[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, V, R any](f func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, ...V) R) func(T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20, []V) R {
|
||||
return func(t1 T1, t2 T2, t3 T3, t4 T4, t5 T5, t6 T6, t7 T7, t8 T8, t9 T9, t10 T10, t11 T11, t12 T12, t13 T13, t14 T14, t15 T15, t16 T16, t17 T17, t18 T18, t19 T19, t20 T20, v []V) R {
|
||||
|
@@ -15,10 +15,9 @@
|
||||
|
||||
// Code generated by go generate; DO NOT EDIT.
|
||||
// This file was generated by robots at
|
||||
// 2023-07-28 15:42:58.8116745 +0200 CEST m=+0.008252901
|
||||
// 2023-07-28 22:48:46.7920356 +0200 CEST m=+0.045177201
|
||||
package identity
|
||||
|
||||
|
||||
import (
|
||||
A "github.com/IBM/fp-go/internal/apply"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
@@ -41,7 +40,7 @@ func SequenceTuple1[T1 any](t T.Tuple1[T1]) T.Tuple1[T1] {
|
||||
}
|
||||
|
||||
// TraverseTuple1 converts a [Tuple1] of [A] via transformation functions transforming [A] to [A] into a [Tuple1].
|
||||
func TraverseTuple1[F1 ~func(A1) T1, A1, T1 any](f1 F1) func (T.Tuple1[A1]) T.Tuple1[T1] {
|
||||
func TraverseTuple1[F1 ~func(A1) T1, A1, T1 any](f1 F1) func(T.Tuple1[A1]) T.Tuple1[T1] {
|
||||
return func(t T.Tuple1[A1]) T.Tuple1[T1] {
|
||||
return A.TraverseTuple1(
|
||||
Map[T1, T.Tuple1[T1]],
|
||||
@@ -71,7 +70,7 @@ func SequenceTuple2[T1, T2 any](t T.Tuple2[T1, T2]) T.Tuple2[T1, T2] {
|
||||
}
|
||||
|
||||
// TraverseTuple2 converts a [Tuple2] of [A] via transformation functions transforming [A] to [A] into a [Tuple2].
|
||||
func TraverseTuple2[F1 ~func(A1) T1, F2 ~func(A2) T2, A1, T1, A2, T2 any](f1 F1, f2 F2) func (T.Tuple2[A1, A2]) T.Tuple2[T1, T2] {
|
||||
func TraverseTuple2[F1 ~func(A1) T1, F2 ~func(A2) T2, A1, T1, A2, T2 any](f1 F1, f2 F2) func(T.Tuple2[A1, A2]) T.Tuple2[T1, T2] {
|
||||
return func(t T.Tuple2[A1, A2]) T.Tuple2[T1, T2] {
|
||||
return A.TraverseTuple2(
|
||||
Map[T1, func(T2) T.Tuple2[T1, T2]],
|
||||
@@ -106,7 +105,7 @@ func SequenceTuple3[T1, T2, T3 any](t T.Tuple3[T1, T2, T3]) T.Tuple3[T1, T2, T3]
|
||||
}
|
||||
|
||||
// TraverseTuple3 converts a [Tuple3] of [A] via transformation functions transforming [A] to [A] into a [Tuple3].
|
||||
func TraverseTuple3[F1 ~func(A1) T1, F2 ~func(A2) T2, F3 ~func(A3) T3, A1, T1, A2, T2, A3, T3 any](f1 F1, f2 F2, f3 F3) func (T.Tuple3[A1, A2, A3]) T.Tuple3[T1, T2, T3] {
|
||||
func TraverseTuple3[F1 ~func(A1) T1, F2 ~func(A2) T2, F3 ~func(A3) T3, A1, T1, A2, T2, A3, T3 any](f1 F1, f2 F2, f3 F3) func(T.Tuple3[A1, A2, A3]) T.Tuple3[T1, T2, T3] {
|
||||
return func(t T.Tuple3[A1, A2, A3]) T.Tuple3[T1, T2, T3] {
|
||||
return A.TraverseTuple3(
|
||||
Map[T1, func(T2) func(T3) T.Tuple3[T1, T2, T3]],
|
||||
@@ -146,7 +145,7 @@ func SequenceTuple4[T1, T2, T3, T4 any](t T.Tuple4[T1, T2, T3, T4]) T.Tuple4[T1,
|
||||
}
|
||||
|
||||
// TraverseTuple4 converts a [Tuple4] of [A] via transformation functions transforming [A] to [A] into a [Tuple4].
|
||||
func TraverseTuple4[F1 ~func(A1) T1, F2 ~func(A2) T2, F3 ~func(A3) T3, F4 ~func(A4) T4, A1, T1, A2, T2, A3, T3, A4, T4 any](f1 F1, f2 F2, f3 F3, f4 F4) func (T.Tuple4[A1, A2, A3, A4]) T.Tuple4[T1, T2, T3, T4] {
|
||||
func TraverseTuple4[F1 ~func(A1) T1, F2 ~func(A2) T2, F3 ~func(A3) T3, F4 ~func(A4) T4, A1, T1, A2, T2, A3, T3, A4, T4 any](f1 F1, f2 F2, f3 F3, f4 F4) func(T.Tuple4[A1, A2, A3, A4]) T.Tuple4[T1, T2, T3, T4] {
|
||||
return func(t T.Tuple4[A1, A2, A3, A4]) T.Tuple4[T1, T2, T3, T4] {
|
||||
return A.TraverseTuple4(
|
||||
Map[T1, func(T2) func(T3) func(T4) T.Tuple4[T1, T2, T3, T4]],
|
||||
@@ -191,7 +190,7 @@ func SequenceTuple5[T1, T2, T3, T4, T5 any](t T.Tuple5[T1, T2, T3, T4, T5]) T.Tu
|
||||
}
|
||||
|
||||
// TraverseTuple5 converts a [Tuple5] of [A] via transformation functions transforming [A] to [A] into a [Tuple5].
|
||||
func TraverseTuple5[F1 ~func(A1) T1, F2 ~func(A2) T2, F3 ~func(A3) T3, F4 ~func(A4) T4, F5 ~func(A5) T5, A1, T1, A2, T2, A3, T3, A4, T4, A5, T5 any](f1 F1, f2 F2, f3 F3, f4 F4, f5 F5) func (T.Tuple5[A1, A2, A3, A4, A5]) T.Tuple5[T1, T2, T3, T4, T5] {
|
||||
func TraverseTuple5[F1 ~func(A1) T1, F2 ~func(A2) T2, F3 ~func(A3) T3, F4 ~func(A4) T4, F5 ~func(A5) T5, A1, T1, A2, T2, A3, T3, A4, T4, A5, T5 any](f1 F1, f2 F2, f3 F3, f4 F4, f5 F5) func(T.Tuple5[A1, A2, A3, A4, A5]) T.Tuple5[T1, T2, T3, T4, T5] {
|
||||
return func(t T.Tuple5[A1, A2, A3, A4, A5]) T.Tuple5[T1, T2, T3, T4, T5] {
|
||||
return A.TraverseTuple5(
|
||||
Map[T1, func(T2) func(T3) func(T4) func(T5) T.Tuple5[T1, T2, T3, T4, T5]],
|
||||
@@ -241,7 +240,7 @@ func SequenceTuple6[T1, T2, T3, T4, T5, T6 any](t T.Tuple6[T1, T2, T3, T4, T5, T
|
||||
}
|
||||
|
||||
// TraverseTuple6 converts a [Tuple6] of [A] via transformation functions transforming [A] to [A] into a [Tuple6].
|
||||
func TraverseTuple6[F1 ~func(A1) T1, F2 ~func(A2) T2, F3 ~func(A3) T3, F4 ~func(A4) T4, F5 ~func(A5) T5, F6 ~func(A6) T6, A1, T1, A2, T2, A3, T3, A4, T4, A5, T5, A6, T6 any](f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6) func (T.Tuple6[A1, A2, A3, A4, A5, A6]) T.Tuple6[T1, T2, T3, T4, T5, T6] {
|
||||
func TraverseTuple6[F1 ~func(A1) T1, F2 ~func(A2) T2, F3 ~func(A3) T3, F4 ~func(A4) T4, F5 ~func(A5) T5, F6 ~func(A6) T6, A1, T1, A2, T2, A3, T3, A4, T4, A5, T5, A6, T6 any](f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6) func(T.Tuple6[A1, A2, A3, A4, A5, A6]) T.Tuple6[T1, T2, T3, T4, T5, T6] {
|
||||
return func(t T.Tuple6[A1, A2, A3, A4, A5, A6]) T.Tuple6[T1, T2, T3, T4, T5, T6] {
|
||||
return A.TraverseTuple6(
|
||||
Map[T1, func(T2) func(T3) func(T4) func(T5) func(T6) T.Tuple6[T1, T2, T3, T4, T5, T6]],
|
||||
@@ -296,7 +295,7 @@ func SequenceTuple7[T1, T2, T3, T4, T5, T6, T7 any](t T.Tuple7[T1, T2, T3, T4, T
|
||||
}
|
||||
|
||||
// TraverseTuple7 converts a [Tuple7] of [A] via transformation functions transforming [A] to [A] into a [Tuple7].
|
||||
func TraverseTuple7[F1 ~func(A1) T1, F2 ~func(A2) T2, F3 ~func(A3) T3, F4 ~func(A4) T4, F5 ~func(A5) T5, F6 ~func(A6) T6, F7 ~func(A7) T7, A1, T1, A2, T2, A3, T3, A4, T4, A5, T5, A6, T6, A7, T7 any](f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6, f7 F7) func (T.Tuple7[A1, A2, A3, A4, A5, A6, A7]) T.Tuple7[T1, T2, T3, T4, T5, T6, T7] {
|
||||
func TraverseTuple7[F1 ~func(A1) T1, F2 ~func(A2) T2, F3 ~func(A3) T3, F4 ~func(A4) T4, F5 ~func(A5) T5, F6 ~func(A6) T6, F7 ~func(A7) T7, A1, T1, A2, T2, A3, T3, A4, T4, A5, T5, A6, T6, A7, T7 any](f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6, f7 F7) func(T.Tuple7[A1, A2, A3, A4, A5, A6, A7]) T.Tuple7[T1, T2, T3, T4, T5, T6, T7] {
|
||||
return func(t T.Tuple7[A1, A2, A3, A4, A5, A6, A7]) T.Tuple7[T1, T2, T3, T4, T5, T6, T7] {
|
||||
return A.TraverseTuple7(
|
||||
Map[T1, func(T2) func(T3) func(T4) func(T5) func(T6) func(T7) T.Tuple7[T1, T2, T3, T4, T5, T6, T7]],
|
||||
@@ -356,7 +355,7 @@ func SequenceTuple8[T1, T2, T3, T4, T5, T6, T7, T8 any](t T.Tuple8[T1, T2, T3, T
|
||||
}
|
||||
|
||||
// TraverseTuple8 converts a [Tuple8] of [A] via transformation functions transforming [A] to [A] into a [Tuple8].
|
||||
func TraverseTuple8[F1 ~func(A1) T1, F2 ~func(A2) T2, F3 ~func(A3) T3, F4 ~func(A4) T4, F5 ~func(A5) T5, F6 ~func(A6) T6, F7 ~func(A7) T7, F8 ~func(A8) T8, A1, T1, A2, T2, A3, T3, A4, T4, A5, T5, A6, T6, A7, T7, A8, T8 any](f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6, f7 F7, f8 F8) func (T.Tuple8[A1, A2, A3, A4, A5, A6, A7, A8]) T.Tuple8[T1, T2, T3, T4, T5, T6, T7, T8] {
|
||||
func TraverseTuple8[F1 ~func(A1) T1, F2 ~func(A2) T2, F3 ~func(A3) T3, F4 ~func(A4) T4, F5 ~func(A5) T5, F6 ~func(A6) T6, F7 ~func(A7) T7, F8 ~func(A8) T8, A1, T1, A2, T2, A3, T3, A4, T4, A5, T5, A6, T6, A7, T7, A8, T8 any](f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6, f7 F7, f8 F8) func(T.Tuple8[A1, A2, A3, A4, A5, A6, A7, A8]) T.Tuple8[T1, T2, T3, T4, T5, T6, T7, T8] {
|
||||
return func(t T.Tuple8[A1, A2, A3, A4, A5, A6, A7, A8]) T.Tuple8[T1, T2, T3, T4, T5, T6, T7, T8] {
|
||||
return A.TraverseTuple8(
|
||||
Map[T1, func(T2) func(T3) func(T4) func(T5) func(T6) func(T7) func(T8) T.Tuple8[T1, T2, T3, T4, T5, T6, T7, T8]],
|
||||
@@ -421,7 +420,7 @@ func SequenceTuple9[T1, T2, T3, T4, T5, T6, T7, T8, T9 any](t T.Tuple9[T1, T2, T
|
||||
}
|
||||
|
||||
// TraverseTuple9 converts a [Tuple9] of [A] via transformation functions transforming [A] to [A] into a [Tuple9].
|
||||
func TraverseTuple9[F1 ~func(A1) T1, F2 ~func(A2) T2, F3 ~func(A3) T3, F4 ~func(A4) T4, F5 ~func(A5) T5, F6 ~func(A6) T6, F7 ~func(A7) T7, F8 ~func(A8) T8, F9 ~func(A9) T9, A1, T1, A2, T2, A3, T3, A4, T4, A5, T5, A6, T6, A7, T7, A8, T8, A9, T9 any](f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6, f7 F7, f8 F8, f9 F9) func (T.Tuple9[A1, A2, A3, A4, A5, A6, A7, A8, A9]) T.Tuple9[T1, T2, T3, T4, T5, T6, T7, T8, T9] {
|
||||
func TraverseTuple9[F1 ~func(A1) T1, F2 ~func(A2) T2, F3 ~func(A3) T3, F4 ~func(A4) T4, F5 ~func(A5) T5, F6 ~func(A6) T6, F7 ~func(A7) T7, F8 ~func(A8) T8, F9 ~func(A9) T9, A1, T1, A2, T2, A3, T3, A4, T4, A5, T5, A6, T6, A7, T7, A8, T8, A9, T9 any](f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6, f7 F7, f8 F8, f9 F9) func(T.Tuple9[A1, A2, A3, A4, A5, A6, A7, A8, A9]) T.Tuple9[T1, T2, T3, T4, T5, T6, T7, T8, T9] {
|
||||
return func(t T.Tuple9[A1, A2, A3, A4, A5, A6, A7, A8, A9]) T.Tuple9[T1, T2, T3, T4, T5, T6, T7, T8, T9] {
|
||||
return A.TraverseTuple9(
|
||||
Map[T1, func(T2) func(T3) func(T4) func(T5) func(T6) func(T7) func(T8) func(T9) T.Tuple9[T1, T2, T3, T4, T5, T6, T7, T8, T9]],
|
||||
@@ -491,7 +490,7 @@ func SequenceTuple10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10 any](t T.Tuple10[T1
|
||||
}
|
||||
|
||||
// TraverseTuple10 converts a [Tuple10] of [A] via transformation functions transforming [A] to [A] into a [Tuple10].
|
||||
func TraverseTuple10[F1 ~func(A1) T1, F2 ~func(A2) T2, F3 ~func(A3) T3, F4 ~func(A4) T4, F5 ~func(A5) T5, F6 ~func(A6) T6, F7 ~func(A7) T7, F8 ~func(A8) T8, F9 ~func(A9) T9, F10 ~func(A10) T10, A1, T1, A2, T2, A3, T3, A4, T4, A5, T5, A6, T6, A7, T7, A8, T8, A9, T9, A10, T10 any](f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6, f7 F7, f8 F8, f9 F9, f10 F10) func (T.Tuple10[A1, A2, A3, A4, A5, A6, A7, A8, A9, A10]) T.Tuple10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10] {
|
||||
func TraverseTuple10[F1 ~func(A1) T1, F2 ~func(A2) T2, F3 ~func(A3) T3, F4 ~func(A4) T4, F5 ~func(A5) T5, F6 ~func(A6) T6, F7 ~func(A7) T7, F8 ~func(A8) T8, F9 ~func(A9) T9, F10 ~func(A10) T10, A1, T1, A2, T2, A3, T3, A4, T4, A5, T5, A6, T6, A7, T7, A8, T8, A9, T9, A10, T10 any](f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6, f7 F7, f8 F8, f9 F9, f10 F10) func(T.Tuple10[A1, A2, A3, A4, A5, A6, A7, A8, A9, A10]) T.Tuple10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10] {
|
||||
return func(t T.Tuple10[A1, A2, A3, A4, A5, A6, A7, A8, A9, A10]) T.Tuple10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10] {
|
||||
return A.TraverseTuple10(
|
||||
Map[T1, func(T2) func(T3) func(T4) func(T5) func(T6) func(T7) func(T8) func(T9) func(T10) T.Tuple10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]],
|
||||
|
@@ -15,10 +15,9 @@
|
||||
|
||||
// Code generated by go generate; DO NOT EDIT.
|
||||
// This file was generated by robots at
|
||||
// 2023-07-28 15:43:00.6284756 +0200 CEST m=+0.013494201
|
||||
// 2023-07-28 22:48:49.4210571 +0200 CEST m=+0.040316501
|
||||
package apply
|
||||
|
||||
|
||||
import (
|
||||
F "github.com/IBM/fp-go/function"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
@@ -43,7 +42,7 @@ func SequenceT1[
|
||||
return F.Pipe1(
|
||||
t1,
|
||||
fmap(tupleConstructor1[T1]()),
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// SequenceTuple1 is a utility function used to implement the sequence operation for higher kinded types based only on map and ap.
|
||||
@@ -60,7 +59,7 @@ func SequenceTuple1[
|
||||
return F.Pipe1(
|
||||
t.F1,
|
||||
fmap(tupleConstructor1[T1]()),
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// TraverseTuple1 is a utility function used to implement the sequence operation for higher kinded types based only on map and ap.
|
||||
@@ -79,7 +78,7 @@ func TraverseTuple1[
|
||||
return F.Pipe1(
|
||||
f1(t.F1),
|
||||
fmap(tupleConstructor1[T1]()),
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// tupleConstructor2 returns a curried version of [T.MakeTuple2]
|
||||
@@ -108,7 +107,7 @@ func SequenceT2[
|
||||
t1,
|
||||
fmap(tupleConstructor2[T1, T2]()),
|
||||
fap1(t2),
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// SequenceTuple2 is a utility function used to implement the sequence operation for higher kinded types based only on map and ap.
|
||||
@@ -131,7 +130,7 @@ func SequenceTuple2[
|
||||
t.F1,
|
||||
fmap(tupleConstructor2[T1, T2]()),
|
||||
fap1(t.F2),
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// TraverseTuple2 is a utility function used to implement the sequence operation for higher kinded types based only on map and ap.
|
||||
@@ -158,7 +157,7 @@ func TraverseTuple2[
|
||||
f1(t.F1),
|
||||
fmap(tupleConstructor2[T1, T2]()),
|
||||
fap1(f2(t.F2)),
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// tupleConstructor3 returns a curried version of [T.MakeTuple3]
|
||||
@@ -194,7 +193,7 @@ func SequenceT3[
|
||||
fmap(tupleConstructor3[T1, T2, T3]()),
|
||||
fap1(t2),
|
||||
fap2(t3),
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// SequenceTuple3 is a utility function used to implement the sequence operation for higher kinded types based only on map and ap.
|
||||
@@ -223,7 +222,7 @@ func SequenceTuple3[
|
||||
fmap(tupleConstructor3[T1, T2, T3]()),
|
||||
fap1(t.F2),
|
||||
fap2(t.F3),
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// TraverseTuple3 is a utility function used to implement the sequence operation for higher kinded types based only on map and ap.
|
||||
@@ -258,7 +257,7 @@ func TraverseTuple3[
|
||||
fmap(tupleConstructor3[T1, T2, T3]()),
|
||||
fap1(f2(t.F2)),
|
||||
fap2(f3(t.F3)),
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// tupleConstructor4 returns a curried version of [T.MakeTuple4]
|
||||
@@ -301,7 +300,7 @@ func SequenceT4[
|
||||
fap1(t2),
|
||||
fap2(t3),
|
||||
fap3(t4),
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// SequenceTuple4 is a utility function used to implement the sequence operation for higher kinded types based only on map and ap.
|
||||
@@ -336,7 +335,7 @@ func SequenceTuple4[
|
||||
fap1(t.F2),
|
||||
fap2(t.F3),
|
||||
fap3(t.F4),
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// TraverseTuple4 is a utility function used to implement the sequence operation for higher kinded types based only on map and ap.
|
||||
@@ -379,7 +378,7 @@ func TraverseTuple4[
|
||||
fap1(f2(t.F2)),
|
||||
fap2(f3(t.F3)),
|
||||
fap3(f4(t.F4)),
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// tupleConstructor5 returns a curried version of [T.MakeTuple5]
|
||||
@@ -429,7 +428,7 @@ func SequenceT5[
|
||||
fap2(t3),
|
||||
fap3(t4),
|
||||
fap4(t5),
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// SequenceTuple5 is a utility function used to implement the sequence operation for higher kinded types based only on map and ap.
|
||||
@@ -470,7 +469,7 @@ func SequenceTuple5[
|
||||
fap2(t.F3),
|
||||
fap3(t.F4),
|
||||
fap4(t.F5),
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// TraverseTuple5 is a utility function used to implement the sequence operation for higher kinded types based only on map and ap.
|
||||
@@ -521,7 +520,7 @@ func TraverseTuple5[
|
||||
fap2(f3(t.F3)),
|
||||
fap3(f4(t.F4)),
|
||||
fap4(f5(t.F5)),
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// tupleConstructor6 returns a curried version of [T.MakeTuple6]
|
||||
@@ -578,7 +577,7 @@ func SequenceT6[
|
||||
fap3(t4),
|
||||
fap4(t5),
|
||||
fap5(t6),
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// SequenceTuple6 is a utility function used to implement the sequence operation for higher kinded types based only on map and ap.
|
||||
@@ -625,7 +624,7 @@ func SequenceTuple6[
|
||||
fap3(t.F4),
|
||||
fap4(t.F5),
|
||||
fap5(t.F6),
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// TraverseTuple6 is a utility function used to implement the sequence operation for higher kinded types based only on map and ap.
|
||||
@@ -684,7 +683,7 @@ func TraverseTuple6[
|
||||
fap3(f4(t.F4)),
|
||||
fap4(f5(t.F5)),
|
||||
fap5(f6(t.F6)),
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// tupleConstructor7 returns a curried version of [T.MakeTuple7]
|
||||
@@ -748,7 +747,7 @@ func SequenceT7[
|
||||
fap4(t5),
|
||||
fap5(t6),
|
||||
fap6(t7),
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// SequenceTuple7 is a utility function used to implement the sequence operation for higher kinded types based only on map and ap.
|
||||
@@ -801,7 +800,7 @@ func SequenceTuple7[
|
||||
fap4(t.F5),
|
||||
fap5(t.F6),
|
||||
fap6(t.F7),
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// TraverseTuple7 is a utility function used to implement the sequence operation for higher kinded types based only on map and ap.
|
||||
@@ -868,7 +867,7 @@ func TraverseTuple7[
|
||||
fap4(f5(t.F5)),
|
||||
fap5(f6(t.F6)),
|
||||
fap6(f7(t.F7)),
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// tupleConstructor8 returns a curried version of [T.MakeTuple8]
|
||||
@@ -939,7 +938,7 @@ func SequenceT8[
|
||||
fap5(t6),
|
||||
fap6(t7),
|
||||
fap7(t8),
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// SequenceTuple8 is a utility function used to implement the sequence operation for higher kinded types based only on map and ap.
|
||||
@@ -998,7 +997,7 @@ func SequenceTuple8[
|
||||
fap5(t.F6),
|
||||
fap6(t.F7),
|
||||
fap7(t.F8),
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// TraverseTuple8 is a utility function used to implement the sequence operation for higher kinded types based only on map and ap.
|
||||
@@ -1073,7 +1072,7 @@ func TraverseTuple8[
|
||||
fap5(f6(t.F6)),
|
||||
fap6(f7(t.F7)),
|
||||
fap7(f8(t.F8)),
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// tupleConstructor9 returns a curried version of [T.MakeTuple9]
|
||||
@@ -1151,7 +1150,7 @@ func SequenceT9[
|
||||
fap6(t7),
|
||||
fap7(t8),
|
||||
fap8(t9),
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// SequenceTuple9 is a utility function used to implement the sequence operation for higher kinded types based only on map and ap.
|
||||
@@ -1216,7 +1215,7 @@ func SequenceTuple9[
|
||||
fap6(t.F7),
|
||||
fap7(t.F8),
|
||||
fap8(t.F9),
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// TraverseTuple9 is a utility function used to implement the sequence operation for higher kinded types based only on map and ap.
|
||||
@@ -1299,7 +1298,7 @@ func TraverseTuple9[
|
||||
fap6(f7(t.F7)),
|
||||
fap7(f8(t.F8)),
|
||||
fap8(f9(t.F9)),
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// tupleConstructor10 returns a curried version of [T.MakeTuple10]
|
||||
@@ -1384,7 +1383,7 @@ func SequenceT10[
|
||||
fap7(t8),
|
||||
fap8(t9),
|
||||
fap9(t10),
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// SequenceTuple10 is a utility function used to implement the sequence operation for higher kinded types based only on map and ap.
|
||||
@@ -1455,7 +1454,7 @@ func SequenceTuple10[
|
||||
fap7(t.F8),
|
||||
fap8(t.F9),
|
||||
fap9(t.F10),
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
// TraverseTuple10 is a utility function used to implement the sequence operation for higher kinded types based only on map and ap.
|
||||
@@ -1546,5 +1545,5 @@ func TraverseTuple10[
|
||||
fap7(f8(t.F8)),
|
||||
fap8(f9(t.F9)),
|
||||
fap9(f10(t.F10)),
|
||||
)
|
||||
)
|
||||
}
|
||||
|
39
io/file/file.go
Normal file
39
io/file/file.go
Normal file
@@ -0,0 +1,39 @@
|
||||
// Copyright (c) 2023 IBM Corp.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package file
|
||||
|
||||
import (
|
||||
"io"
|
||||
"os"
|
||||
|
||||
IO "github.com/IBM/fp-go/io"
|
||||
)
|
||||
|
||||
// Close closes a closeable resource and ignores a potential error
|
||||
func Close[R io.Closer](r R) IO.IO[R] {
|
||||
return IO.MakeIO[R](func() R {
|
||||
r.Close() // #nosec: G104
|
||||
return r
|
||||
})
|
||||
}
|
||||
|
||||
// Remove removes a resource and ignores a potential error
|
||||
func Remove(name string) IO.IO[string] {
|
||||
return IO.MakeIO[string](func() string {
|
||||
os.Remove(name) // #nosec: G104
|
||||
return name
|
||||
})
|
||||
}
|
@@ -15,10 +15,9 @@
|
||||
|
||||
// Code generated by go generate; DO NOT EDIT.
|
||||
// This file was generated by robots at
|
||||
// 2023-07-28 15:43:07.1016885 +0200 CEST m=+0.039744901
|
||||
// 2023-07-28 22:48:57.7378739 +0200 CEST m=+0.063371401
|
||||
package io
|
||||
|
||||
|
||||
import (
|
||||
G "github.com/IBM/fp-go/io/generic"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
|
@@ -15,13 +15,12 @@
|
||||
|
||||
// Code generated by go generate; DO NOT EDIT.
|
||||
// This file was generated by robots at
|
||||
// 2023-07-28 15:43:07.1026882 +0200 CEST m=+0.040744601
|
||||
// 2023-07-28 22:48:57.7499229 +0200 CEST m=+0.075420401
|
||||
package generic
|
||||
|
||||
|
||||
import (
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
A "github.com/IBM/fp-go/internal/apply"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
)
|
||||
|
||||
// SequenceT1 converts 1 [func() T] into a [func() T.Tuple1[T1]]
|
||||
|
@@ -21,6 +21,7 @@ import (
|
||||
IOE "github.com/IBM/fp-go/ioeither"
|
||||
)
|
||||
|
||||
// onClose closes a closeable resource
|
||||
func onClose[R io.Closer](r R) IOE.IOEither[error, R] {
|
||||
return IOE.TryCatchError(func() (R, error) {
|
||||
return r, r.Close()
|
||||
|
@@ -24,14 +24,24 @@ import (
|
||||
var (
|
||||
// Open opens a file for reading
|
||||
Open = IOE.Eitherize1(os.Open)
|
||||
// Create opens a file for writing
|
||||
Create = IOE.Eitherize1(os.Create)
|
||||
// ReadFile reads the context of a file
|
||||
ReadFile = IOE.Eitherize1(os.ReadFile)
|
||||
// WriteFile writes a data blob to a file
|
||||
WriteFile = func(dstName string, perm os.FileMode) func([]byte) IOE.IOEither[error, []byte] {
|
||||
)
|
||||
|
||||
// WriteFile writes a data blob to a file
|
||||
func WriteFile(dstName string, perm os.FileMode) func([]byte) IOE.IOEither[error, []byte] {
|
||||
return func(data []byte) IOE.IOEither[error, []byte] {
|
||||
return IOE.TryCatchError(func() ([]byte, error) {
|
||||
return data, os.WriteFile(dstName, data, perm)
|
||||
})
|
||||
}
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
// Remove removes a file by name
|
||||
func Remove(name string) IOE.IOEither[error, string] {
|
||||
return IOE.TryCatchError(func() (string, error) {
|
||||
return name, os.Remove(name)
|
||||
})
|
||||
}
|
||||
|
@@ -29,7 +29,7 @@ func onReadAll[R io.Reader](r R) IOE.IOEither[error, []byte] {
|
||||
|
||||
// ReadAll uses a generator function to create a stream, reads it and closes it
|
||||
func ReadAll[R io.ReadCloser](acquire IOE.IOEither[error, R]) IOE.IOEither[error, []byte] {
|
||||
return IOE.WithResource[error, R, []byte](
|
||||
return IOE.WithResource[[]byte](
|
||||
acquire,
|
||||
onClose[R])(
|
||||
onReadAll[R],
|
||||
|
45
ioeither/file/tempfile.go
Normal file
45
ioeither/file/tempfile.go
Normal file
@@ -0,0 +1,45 @@
|
||||
// Copyright (c) 2023 IBM Corp.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package file
|
||||
|
||||
import (
|
||||
"os"
|
||||
|
||||
FL "github.com/IBM/fp-go/file"
|
||||
F "github.com/IBM/fp-go/function"
|
||||
IO "github.com/IBM/fp-go/io"
|
||||
IOF "github.com/IBM/fp-go/io/file"
|
||||
IOE "github.com/IBM/fp-go/ioeither"
|
||||
)
|
||||
|
||||
var (
|
||||
// CreateTemp created a temp file with proper parametrization
|
||||
CreateTemp = IOE.Eitherize2(os.CreateTemp)
|
||||
// onCreateTempFile creates a temp file with sensible defaults
|
||||
onCreateTempFile = CreateTemp("", "*")
|
||||
// destroy handler
|
||||
onReleaseTempFile = F.Flow4(
|
||||
IOF.Close[*os.File],
|
||||
IO.Map(FL.GetName),
|
||||
IOE.FromIO[error, string],
|
||||
IOE.Chain(Remove),
|
||||
)
|
||||
)
|
||||
|
||||
// WithTempFile creates a temporary file, then invokes a callback to create a resource based on the file, then close and remove the temp file
|
||||
func WithTempFile[A any](f func(*os.File) IOE.IOEither[error, A]) IOE.IOEither[error, A] {
|
||||
return IOE.WithResource[A](onCreateTempFile, onReleaseTempFile)(f)
|
||||
}
|
46
ioeither/file/tempfile_test.go
Normal file
46
ioeither/file/tempfile_test.go
Normal file
@@ -0,0 +1,46 @@
|
||||
// Copyright (c) 2023 IBM Corp.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package file
|
||||
|
||||
import (
|
||||
"os"
|
||||
"testing"
|
||||
|
||||
E "github.com/IBM/fp-go/either"
|
||||
F "github.com/IBM/fp-go/function"
|
||||
IOE "github.com/IBM/fp-go/ioeither"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestWithTempFile(t *testing.T) {
|
||||
|
||||
res := WithTempFile(onWriteAll[*os.File]([]byte("Carsten")))
|
||||
|
||||
assert.Equal(t, E.Of[error]([]byte("Carsten")), res())
|
||||
}
|
||||
|
||||
func TestWithTempFileOnClosedFile(t *testing.T) {
|
||||
|
||||
res := WithTempFile(func(f *os.File) IOE.IOEither[error, []byte] {
|
||||
return F.Pipe2(
|
||||
f,
|
||||
onWriteAll[*os.File]([]byte("Carsten")),
|
||||
IOE.ChainFirst(F.Constant1[[]byte](onClose(f))),
|
||||
)
|
||||
})
|
||||
|
||||
assert.Equal(t, E.Of[error]([]byte("Carsten")), res())
|
||||
}
|
@@ -34,7 +34,7 @@ func onWriteAll[W io.Writer](data []byte) func(w W) IOE.IOEither[error, []byte]
|
||||
func WriteAll[W io.WriteCloser](data []byte) func(acquire IOE.IOEither[error, W]) IOE.IOEither[error, []byte] {
|
||||
onWrite := onWriteAll[W](data)
|
||||
return func(onCreate IOE.IOEither[error, W]) IOE.IOEither[error, []byte] {
|
||||
return IOE.WithResource[error, W, []byte](
|
||||
return IOE.WithResource[[]byte](
|
||||
onCreate,
|
||||
onClose[W])(
|
||||
onWrite,
|
||||
@@ -43,8 +43,8 @@ func WriteAll[W io.WriteCloser](data []byte) func(acquire IOE.IOEither[error, W]
|
||||
}
|
||||
|
||||
// Write uses a generator function to create a stream, writes data to it and closes it
|
||||
func Write[W io.WriteCloser, R any](acquire IOE.IOEither[error, W]) func(use func(W) IOE.IOEither[error, R]) IOE.IOEither[error, R] {
|
||||
return IOE.WithResource[error, W, R](
|
||||
func Write[R any, W io.WriteCloser](acquire IOE.IOEither[error, W]) func(use func(W) IOE.IOEither[error, R]) IOE.IOEither[error, R] {
|
||||
return IOE.WithResource[R](
|
||||
acquire,
|
||||
onClose[W])
|
||||
}
|
||||
|
@@ -15,10 +15,9 @@
|
||||
|
||||
// Code generated by go generate; DO NOT EDIT.
|
||||
// This file was generated by robots at
|
||||
// 2023-07-28 15:43:09.9125541 +0200 CEST m=+0.083065801
|
||||
// 2023-07-28 22:49:00.7618943 +0200 CEST m=+0.065441701
|
||||
package ioeither
|
||||
|
||||
|
||||
import (
|
||||
G "github.com/IBM/fp-go/ioeither/generic"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
|
@@ -15,14 +15,13 @@
|
||||
|
||||
// Code generated by go generate; DO NOT EDIT.
|
||||
// This file was generated by robots at
|
||||
// 2023-07-28 15:43:09.9180997 +0200 CEST m=+0.088611401
|
||||
// 2023-07-28 22:49:00.7765028 +0200 CEST m=+0.080050201
|
||||
package generic
|
||||
|
||||
|
||||
import (
|
||||
ET "github.com/IBM/fp-go/either"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
A "github.com/IBM/fp-go/internal/apply"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
)
|
||||
|
||||
// Eitherize0 converts a function with 0 parameters returning a tuple into a function with 0 parameters returning a [GIOA]
|
||||
@@ -31,7 +30,8 @@ func Eitherize0[GIOA ~func() ET.Either[error, R], F ~func() (R, error), R any](f
|
||||
return func() GIOA {
|
||||
return func() ET.Either[error, R] {
|
||||
return e()
|
||||
}}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Uneitherize0 converts a function with 0 parameters returning a tuple into a function with 0 parameters returning a [GIOA]
|
||||
@@ -47,7 +47,8 @@ func Eitherize1[GIOA ~func() ET.Either[error, R], F ~func(T1) (R, error), T1, R
|
||||
return func(t1 T1) GIOA {
|
||||
return func() ET.Either[error, R] {
|
||||
return e(t1)
|
||||
}}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Uneitherize1 converts a function with 1 parameters returning a tuple into a function with 1 parameters returning a [GIOA]
|
||||
@@ -100,7 +101,8 @@ func Eitherize2[GIOA ~func() ET.Either[error, R], F ~func(T1, T2) (R, error), T1
|
||||
return func(t1 T1, t2 T2) GIOA {
|
||||
return func() ET.Either[error, R] {
|
||||
return e(t1, t2)
|
||||
}}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Uneitherize2 converts a function with 2 parameters returning a tuple into a function with 2 parameters returning a [GIOA]
|
||||
@@ -163,7 +165,8 @@ func Eitherize3[GIOA ~func() ET.Either[error, R], F ~func(T1, T2, T3) (R, error)
|
||||
return func(t1 T1, t2 T2, t3 T3) GIOA {
|
||||
return func() ET.Either[error, R] {
|
||||
return e(t1, t2, t3)
|
||||
}}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Uneitherize3 converts a function with 3 parameters returning a tuple into a function with 3 parameters returning a [GIOA]
|
||||
@@ -236,7 +239,8 @@ func Eitherize4[GIOA ~func() ET.Either[error, R], F ~func(T1, T2, T3, T4) (R, er
|
||||
return func(t1 T1, t2 T2, t3 T3, t4 T4) GIOA {
|
||||
return func() ET.Either[error, R] {
|
||||
return e(t1, t2, t3, t4)
|
||||
}}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Uneitherize4 converts a function with 4 parameters returning a tuple into a function with 4 parameters returning a [GIOA]
|
||||
@@ -319,7 +323,8 @@ func Eitherize5[GIOA ~func() ET.Either[error, R], F ~func(T1, T2, T3, T4, T5) (R
|
||||
return func(t1 T1, t2 T2, t3 T3, t4 T4, t5 T5) GIOA {
|
||||
return func() ET.Either[error, R] {
|
||||
return e(t1, t2, t3, t4, t5)
|
||||
}}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Uneitherize5 converts a function with 5 parameters returning a tuple into a function with 5 parameters returning a [GIOA]
|
||||
@@ -412,7 +417,8 @@ func Eitherize6[GIOA ~func() ET.Either[error, R], F ~func(T1, T2, T3, T4, T5, T6
|
||||
return func(t1 T1, t2 T2, t3 T3, t4 T4, t5 T5, t6 T6) GIOA {
|
||||
return func() ET.Either[error, R] {
|
||||
return e(t1, t2, t3, t4, t5, t6)
|
||||
}}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Uneitherize6 converts a function with 6 parameters returning a tuple into a function with 6 parameters returning a [GIOA]
|
||||
@@ -515,7 +521,8 @@ func Eitherize7[GIOA ~func() ET.Either[error, R], F ~func(T1, T2, T3, T4, T5, T6
|
||||
return func(t1 T1, t2 T2, t3 T3, t4 T4, t5 T5, t6 T6, t7 T7) GIOA {
|
||||
return func() ET.Either[error, R] {
|
||||
return e(t1, t2, t3, t4, t5, t6, t7)
|
||||
}}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Uneitherize7 converts a function with 7 parameters returning a tuple into a function with 7 parameters returning a [GIOA]
|
||||
@@ -628,7 +635,8 @@ func Eitherize8[GIOA ~func() ET.Either[error, R], F ~func(T1, T2, T3, T4, T5, T6
|
||||
return func(t1 T1, t2 T2, t3 T3, t4 T4, t5 T5, t6 T6, t7 T7, t8 T8) GIOA {
|
||||
return func() ET.Either[error, R] {
|
||||
return e(t1, t2, t3, t4, t5, t6, t7, t8)
|
||||
}}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Uneitherize8 converts a function with 8 parameters returning a tuple into a function with 8 parameters returning a [GIOA]
|
||||
@@ -751,7 +759,8 @@ func Eitherize9[GIOA ~func() ET.Either[error, R], F ~func(T1, T2, T3, T4, T5, T6
|
||||
return func(t1 T1, t2 T2, t3 T3, t4 T4, t5 T5, t6 T6, t7 T7, t8 T8, t9 T9) GIOA {
|
||||
return func() ET.Either[error, R] {
|
||||
return e(t1, t2, t3, t4, t5, t6, t7, t8, t9)
|
||||
}}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Uneitherize9 converts a function with 9 parameters returning a tuple into a function with 9 parameters returning a [GIOA]
|
||||
@@ -884,7 +893,8 @@ func Eitherize10[GIOA ~func() ET.Either[error, R], F ~func(T1, T2, T3, T4, T5, T
|
||||
return func(t1 T1, t2 T2, t3 T3, t4 T4, t5 T5, t6 T6, t7 T7, t8 T8, t9 T9, t10 T10) GIOA {
|
||||
return func() ET.Either[error, R] {
|
||||
return e(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10)
|
||||
}}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Uneitherize10 converts a function with 10 parameters returning a tuple into a function with 10 parameters returning a [GIOA]
|
||||
|
@@ -192,7 +192,7 @@ func ChainFirstIOK[E, A, B any](f func(A) I.IO[B]) func(IOEither[E, A]) IOEither
|
||||
}
|
||||
|
||||
// WithResource constructs a function that creates a resource, then operates on it and then releases the resource
|
||||
func WithResource[E, R, A, ANY any](onCreate IOEither[E, R], onRelease func(R) IOEither[E, ANY]) func(func(R) IOEither[E, A]) IOEither[E, A] {
|
||||
func WithResource[A, E, R, ANY any](onCreate IOEither[E, R], onRelease func(R) IOEither[E, ANY]) func(func(R) IOEither[E, A]) IOEither[E, A] {
|
||||
return G.WithResource[IOEither[E, A]](onCreate, onRelease)
|
||||
}
|
||||
|
||||
|
@@ -15,10 +15,9 @@
|
||||
|
||||
// Code generated by go generate; DO NOT EDIT.
|
||||
// This file was generated by robots at
|
||||
// 2023-07-28 15:43:14.520059 +0200 CEST m=+0.012057201
|
||||
// 2023-07-28 22:49:03.8471425 +0200 CEST m=+0.087124201
|
||||
package iooption
|
||||
|
||||
|
||||
import (
|
||||
G "github.com/IBM/fp-go/iooption/generic"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
|
@@ -15,14 +15,13 @@
|
||||
|
||||
// Code generated by go generate; DO NOT EDIT.
|
||||
// This file was generated by robots at
|
||||
// 2023-07-28 15:43:14.5210603 +0200 CEST m=+0.013058501
|
||||
// 2023-07-28 22:49:03.8541587 +0200 CEST m=+0.094140401
|
||||
package generic
|
||||
|
||||
|
||||
import (
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
O "github.com/IBM/fp-go/option"
|
||||
A "github.com/IBM/fp-go/internal/apply"
|
||||
O "github.com/IBM/fp-go/option"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
)
|
||||
|
||||
// SequenceT1 converts 1 [func() O.Option[T]] into a [func() O.Option[T.Tuple1[T1]]]
|
||||
|
27
iterator/stateless/compress.go
Normal file
27
iterator/stateless/compress.go
Normal file
@@ -0,0 +1,27 @@
|
||||
// Copyright (c) 2023 IBM Corp.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package stateless
|
||||
|
||||
import (
|
||||
G "github.com/IBM/fp-go/iterator/stateless/generic"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
)
|
||||
|
||||
// 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)
|
||||
}
|
35
iterator/stateless/compress_test.go
Normal file
35
iterator/stateless/compress_test.go
Normal file
@@ -0,0 +1,35 @@
|
||||
// Copyright (c) 2023 IBM Corp.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package stateless
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
A "github.com/IBM/fp-go/array"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestCompress(t *testing.T) {
|
||||
// sequence of 5 items
|
||||
data := From(0, 1, 2, 3)
|
||||
// select some of these items
|
||||
selector := From(true, false, false, true)
|
||||
// compressed result
|
||||
compressed := Compress[int](selector)(data)
|
||||
|
||||
assert.Equal(t, A.From(0, 3), ToArray(compressed))
|
||||
|
||||
}
|
26
iterator/stateless/cycle.go
Normal file
26
iterator/stateless/cycle.go
Normal file
@@ -0,0 +1,26 @@
|
||||
// Copyright (c) 2023 IBM Corp.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package stateless
|
||||
|
||||
import (
|
||||
G "github.com/IBM/fp-go/iterator/stateless/generic"
|
||||
)
|
||||
|
||||
// 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 Cycle[U any](ma Iterator[U]) Iterator[U] {
|
||||
return G.Cycle[Iterator[U]](ma)
|
||||
}
|
33
iterator/stateless/cycle_test.go
Normal file
33
iterator/stateless/cycle_test.go
Normal file
@@ -0,0 +1,33 @@
|
||||
// Copyright (c) 2023 IBM Corp.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package stateless
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
A "github.com/IBM/fp-go/array"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestCycle(t *testing.T) {
|
||||
// sequence of 5 items
|
||||
items := Take[int](5)(Count(0))
|
||||
// repeat
|
||||
repeated := Take[int](17)(Cycle(items))
|
||||
|
||||
assert.Equal(t, A.From(0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1), ToArray(repeated))
|
||||
|
||||
}
|
26
iterator/stateless/dropwhile.go
Normal file
26
iterator/stateless/dropwhile.go
Normal file
@@ -0,0 +1,26 @@
|
||||
// Copyright (c) 2023 IBM Corp.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package stateless
|
||||
|
||||
import (
|
||||
G "github.com/IBM/fp-go/iterator/stateless/generic"
|
||||
)
|
||||
|
||||
// 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[U any](pred func(U) bool) func(Iterator[U]) Iterator[U] {
|
||||
return G.DropWhile[Iterator[U]](pred)
|
||||
}
|
35
iterator/stateless/dropwhile_test.go
Normal file
35
iterator/stateless/dropwhile_test.go
Normal file
@@ -0,0 +1,35 @@
|
||||
// Copyright (c) 2023 IBM Corp.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package stateless
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
A "github.com/IBM/fp-go/array"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestDropWhile(t *testing.T) {
|
||||
// sequence of 5 items
|
||||
data := Take[int](10)(Cycle(From(0, 1, 2, 3)))
|
||||
|
||||
total := DropWhile(func(data int) bool {
|
||||
return data <= 2
|
||||
})(data)
|
||||
|
||||
assert.Equal(t, A.From(3, 0, 1, 2, 3, 0, 1), ToArray(total))
|
||||
|
||||
}
|
26
iterator/stateless/first.go
Normal file
26
iterator/stateless/first.go
Normal file
@@ -0,0 +1,26 @@
|
||||
// Copyright (c) 2023 IBM Corp.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package stateless
|
||||
|
||||
import (
|
||||
G "github.com/IBM/fp-go/iterator/stateless/generic"
|
||||
O "github.com/IBM/fp-go/option"
|
||||
)
|
||||
|
||||
// First returns the first item in an iterator if such an item exists
|
||||
func First[U any](mu Iterator[U]) O.Option[U] {
|
||||
return G.First[Iterator[U]](mu)
|
||||
}
|
41
iterator/stateless/first_test.go
Normal file
41
iterator/stateless/first_test.go
Normal file
@@ -0,0 +1,41 @@
|
||||
// Copyright (c) 2023 IBM Corp.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package stateless
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
O "github.com/IBM/fp-go/option"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestFirst(t *testing.T) {
|
||||
|
||||
seq := From(1, 2, 3)
|
||||
|
||||
fst := First(seq)
|
||||
|
||||
assert.Equal(t, O.Of(1), fst)
|
||||
}
|
||||
|
||||
func TestNoFirst(t *testing.T) {
|
||||
|
||||
seq := Empty[int]()
|
||||
|
||||
fst := First(seq)
|
||||
|
||||
assert.Equal(t, O.None[int](), fst)
|
||||
}
|
34
iterator/stateless/generic/compress.go
Normal file
34
iterator/stateless/generic/compress.go
Normal file
@@ -0,0 +1,34 @@
|
||||
// Copyright (c) 2023 IBM Corp.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package generic
|
||||
|
||||
import (
|
||||
F "github.com/IBM/fp-go/function"
|
||||
O "github.com/IBM/fp-go/option"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
)
|
||||
|
||||
// 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 {
|
||||
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]),
|
||||
)),
|
||||
)
|
||||
}
|
43
iterator/stateless/generic/cycle.go
Normal file
43
iterator/stateless/generic/cycle.go
Normal file
@@ -0,0 +1,43 @@
|
||||
// Copyright (c) 2023 IBM Corp.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package generic
|
||||
|
||||
import (
|
||||
F "github.com/IBM/fp-go/function"
|
||||
O "github.com/IBM/fp-go/option"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
)
|
||||
|
||||
func Cycle[GU ~func() O.Option[T.Tuple2[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]]
|
||||
|
||||
recurse := func(mu GU) GU {
|
||||
return F.Nullary2(
|
||||
mu,
|
||||
m,
|
||||
)
|
||||
}
|
||||
|
||||
m = O.Fold(func() O.Option[T.Tuple2[GU, U]] {
|
||||
return recurse(ma)()
|
||||
}, F.Flow2(
|
||||
T.Map2(recurse, F.Identity[U]),
|
||||
O.Of[T.Tuple2[GU, U]],
|
||||
))
|
||||
|
||||
return recurse(ma)
|
||||
}
|
49
iterator/stateless/generic/dropwhile.go
Normal file
49
iterator/stateless/generic/dropwhile.go
Normal file
@@ -0,0 +1,49 @@
|
||||
// Copyright (c) 2023 IBM Corp.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
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"
|
||||
)
|
||||
|
||||
// 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 {
|
||||
// avoid cyclic references
|
||||
var m func(O.Option[T.Tuple2[GU, U]]) O.Option[T.Tuple2[GU, U]]
|
||||
|
||||
fromPred := O.FromPredicate(P.Not(P.ContraMap(T.Second[GU, U])(pred)))
|
||||
|
||||
recurse := func(mu GU) GU {
|
||||
return F.Nullary2(
|
||||
mu,
|
||||
m,
|
||||
)
|
||||
}
|
||||
|
||||
m = O.Chain(func(t T.Tuple2[GU, U]) O.Option[T.Tuple2[GU, U]] {
|
||||
return F.Pipe2(
|
||||
t,
|
||||
fromPred,
|
||||
O.Fold(recurse(t.F1), O.Of[T.Tuple2[GU, U]]),
|
||||
)
|
||||
})
|
||||
|
||||
return recurse
|
||||
}
|
30
iterator/stateless/generic/first.go
Normal file
30
iterator/stateless/generic/first.go
Normal file
@@ -0,0 +1,30 @@
|
||||
// Copyright (c) 2023 IBM Corp.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package generic
|
||||
|
||||
import (
|
||||
F "github.com/IBM/fp-go/function"
|
||||
O "github.com/IBM/fp-go/option"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
)
|
||||
|
||||
// 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] {
|
||||
return F.Pipe1(
|
||||
mu(),
|
||||
O.Map(T.Second[GU, U]),
|
||||
)
|
||||
}
|
@@ -20,7 +20,8 @@ import (
|
||||
F "github.com/IBM/fp-go/function"
|
||||
"github.com/IBM/fp-go/internal/utils"
|
||||
IO "github.com/IBM/fp-go/iooption/generic"
|
||||
N "github.com/IBM/fp-go/number/integer"
|
||||
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"
|
||||
)
|
||||
@@ -49,9 +50,8 @@ func FromArray[GU ~func() O.Option[T.Tuple2[GU, U]], US ~[]U, U any](as US) GU {
|
||||
})(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](f func(V, U) V, initial V) func(GU) V {
|
||||
return func(as GU) V {
|
||||
// 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 {
|
||||
next, ok := O.Unwrap(as())
|
||||
current := initial
|
||||
for ok {
|
||||
@@ -60,7 +60,11 @@ func Reduce[GU ~func() O.Option[T.Tuple2[GU, U]], U, V any](f func(V, U) V, init
|
||||
next, ok = O.Unwrap(next.F1())
|
||||
}
|
||||
return current
|
||||
}
|
||||
}
|
||||
|
||||
// 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 {
|
||||
return F.Bind23of3(reduce[GU, U, V])(f, initial)
|
||||
}
|
||||
|
||||
// ToArray converts the iterator to an array
|
||||
@@ -135,38 +139,49 @@ func Flatten[GV ~func() O.Option[T.Tuple2[GV, GU]], GU ~func() O.Option[T.Tuple2
|
||||
return MonadChain(ma, F.Identity[GU])
|
||||
}
|
||||
|
||||
// MakeBy returns an [Iterator] with `n` elements initialized with `f(i)`
|
||||
func MakeBy[GU ~func() O.Option[T.Tuple2[GU, U]], FCT ~func(int) U, U any](n int, f FCT) 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 {
|
||||
|
||||
var m func(int) O.Option[T.Tuple2[GU, U]]
|
||||
|
||||
recurse := func(i int) GU {
|
||||
return func() O.Option[T.Tuple2[GU, U]] {
|
||||
return F.Pipe1(
|
||||
i,
|
||||
return F.Nullary2(
|
||||
F.Constant(i),
|
||||
m,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
m = F.Flow2(
|
||||
O.FromPredicate(N.Between(0, n)),
|
||||
O.Map(F.Flow2(
|
||||
m = F.Flow3(
|
||||
T.Replicate2[int],
|
||||
T.Map2(F.Flow2(
|
||||
utils.Inc,
|
||||
recurse),
|
||||
f),
|
||||
)),
|
||||
O.Of[T.Tuple2[GU, U]],
|
||||
)
|
||||
|
||||
// bootstrap
|
||||
return recurse(0)
|
||||
}
|
||||
|
||||
// Replicate creates an [Iterator] containing a value repeated the specified number of times.
|
||||
func Replicate[GU ~func() O.Option[T.Tuple2[GU, U]], U any](n int, a U) GU {
|
||||
return MakeBy[GU](n, F.Constant1[int](a))
|
||||
// Replicate creates an infinite [Iterator] containing a value.
|
||||
func Replicate[GU ~func() O.Option[T.Tuple2[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 {
|
||||
return F.Pipe2(
|
||||
a,
|
||||
Replicate[GU],
|
||||
Take[GU](n),
|
||||
)
|
||||
}
|
||||
|
||||
// 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 {
|
||||
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 {
|
||||
@@ -205,3 +220,22 @@ func Ap[GUV ~func() O.Option[T.Tuple2[GUV, func(U) V]], GV ~func() O.Option[T.Tu
|
||||
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 {
|
||||
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 {
|
||||
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 {
|
||||
return func(f FCT) func(ma GU) V {
|
||||
return Reduce[GU](func(cur V, a U) V {
|
||||
return m.Concat(cur, f(a))
|
||||
}, m.Empty())
|
||||
}
|
||||
}
|
||||
|
||||
func Fold[GU ~func() O.Option[T.Tuple2[GU, U]], U any](m M.Monoid[U]) func(ma GU) U {
|
||||
return Reduce[GU](m.Concat, m.Empty())
|
||||
}
|
||||
|
27
iterator/stateless/generic/last.go
Normal file
27
iterator/stateless/generic/last.go
Normal file
@@ -0,0 +1,27 @@
|
||||
// Copyright (c) 2023 IBM Corp.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package generic
|
||||
|
||||
import (
|
||||
F "github.com/IBM/fp-go/function"
|
||||
O "github.com/IBM/fp-go/option"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
)
|
||||
|
||||
// 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] {
|
||||
return reduce(mu, F.Ignore1of2[O.Option[U]](O.Of[U]), O.None[U]())
|
||||
}
|
45
iterator/stateless/generic/scan.go
Normal file
45
iterator/stateless/generic/scan.go
Normal file
@@ -0,0 +1,45 @@
|
||||
// Copyright (c) 2023 IBM Corp.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package generic
|
||||
|
||||
import (
|
||||
F "github.com/IBM/fp-go/function"
|
||||
O "github.com/IBM/fp-go/option"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
)
|
||||
|
||||
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 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 {
|
||||
// pre-declare to avoid cyclic reference
|
||||
var m func(GU) func(V) GV
|
||||
|
||||
recurse := func(ma GU, current V) GV {
|
||||
return F.Nullary2(
|
||||
ma,
|
||||
O.Map(F.Flow2(
|
||||
T.Map2(m, F.Bind1st(f, current)),
|
||||
apTuple[V, GV],
|
||||
)),
|
||||
)
|
||||
}
|
||||
|
||||
m = F.Curry2(recurse)
|
||||
|
||||
return F.Bind2nd(recurse, initial)
|
||||
}
|
43
iterator/stateless/generic/take.go
Normal file
43
iterator/stateless/generic/take.go
Normal file
@@ -0,0 +1,43 @@
|
||||
// Copyright (c) 2023 IBM Corp.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package generic
|
||||
|
||||
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"
|
||||
)
|
||||
|
||||
func Take[GU ~func() O.Option[T.Tuple2[GU, U]], U any](n int) func(ma GU) GU {
|
||||
// pre-declare to avoid cyclic reference
|
||||
var recurse func(ma GU, idx int) GU
|
||||
|
||||
fromPred := O.FromPredicate(N.Between(0, n))
|
||||
|
||||
recurse = func(ma GU, idx int) GU {
|
||||
return F.Nullary3(
|
||||
F.Constant(idx),
|
||||
fromPred,
|
||||
O.Chain(F.Ignore1of1[int](F.Nullary2(
|
||||
ma,
|
||||
O.Map(T.Map2(F.Bind2nd(recurse, idx+1), F.Identity[U])),
|
||||
))),
|
||||
)
|
||||
}
|
||||
|
||||
return F.Bind2nd(recurse, 0)
|
||||
}
|
62
iterator/stateless/generic/uniq.go
Normal file
62
iterator/stateless/generic/uniq.go
Normal file
@@ -0,0 +1,62 @@
|
||||
// Copyright (c) 2023 IBM Corp.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package generic
|
||||
|
||||
import (
|
||||
F "github.com/IBM/fp-go/function"
|
||||
O "github.com/IBM/fp-go/option"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
)
|
||||
|
||||
// addToMap makes a deep copy of a map and adds a value
|
||||
func addToMap[A comparable](a A, m map[A]bool) map[A]bool {
|
||||
cpy := make(map[A]bool, len(m)+1)
|
||||
for k, v := range m {
|
||||
cpy[k] = v
|
||||
}
|
||||
cpy[a] = true
|
||||
return cpy
|
||||
}
|
||||
|
||||
func Uniq[AS ~func() O.Option[T.Tuple2[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]] {
|
||||
return F.Pipe3(
|
||||
a.F2,
|
||||
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))
|
||||
}),
|
||||
)
|
||||
}),
|
||||
)
|
||||
}
|
||||
|
||||
return F.Bind2nd(recurse, make(map[K]bool, 0))
|
||||
}
|
||||
|
||||
func StrictUniq[AS ~func() O.Option[T.Tuple2[AS, A]], A comparable](as AS) AS {
|
||||
return Uniq[AS](F.Identity[A])(as)
|
||||
}
|
54
iterator/stateless/generic/zip.go
Normal file
54
iterator/stateless/generic/zip.go
Normal file
@@ -0,0 +1,54 @@
|
||||
// Copyright (c) 2023 IBM Corp.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package generic
|
||||
|
||||
import (
|
||||
F "github.com/IBM/fp-go/function"
|
||||
O "github.com/IBM/fp-go/option"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
)
|
||||
|
||||
// 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 {
|
||||
// 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]]
|
||||
|
||||
recurse := func(as AS, bs BS) CS {
|
||||
return func() O.Option[T.Tuple2[CS, C]] {
|
||||
// combine
|
||||
return F.Pipe1(
|
||||
T.MakeTuple2(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))
|
||||
}))
|
||||
|
||||
// trigger the recursion
|
||||
return recurse(fa, fb)
|
||||
}
|
||||
|
||||
// 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])
|
||||
}
|
@@ -18,6 +18,7 @@ package stateless
|
||||
import (
|
||||
G "github.com/IBM/fp-go/iterator/stateless/generic"
|
||||
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"
|
||||
)
|
||||
@@ -78,14 +79,14 @@ func From[U any](data ...U) Iterator[U] {
|
||||
return G.From[Iterator[U]](data...)
|
||||
}
|
||||
|
||||
// MakeBy returns an [Iterator] with `n` elements initialized with `f(i)`
|
||||
func MakeBy[FCT ~func(int) U, U any](n int, f FCT) Iterator[U] {
|
||||
return G.MakeBy[Iterator[U]](n, f)
|
||||
// MakeBy returns an [Iterator] with an infinite number of elements initialized with `f(i)`
|
||||
func MakeBy[FCT ~func(int) U, U any](f FCT) Iterator[U] {
|
||||
return G.MakeBy[Iterator[U]](f)
|
||||
}
|
||||
|
||||
// Replicate creates an [Iterator] containing a value repeated the specified number of times.
|
||||
func Replicate[U any](n int, a U) Iterator[U] {
|
||||
return G.Replicate[Iterator[U]](n, a)
|
||||
// Replicate creates an [Iterator] containing a value repeated an infinite number of times.
|
||||
func Replicate[U any](a U) Iterator[U] {
|
||||
return G.Replicate[Iterator[U]](a)
|
||||
}
|
||||
|
||||
// FilterMap filters and transforms the content of an iterator
|
||||
@@ -107,3 +108,29 @@ func Ap[V, U any](ma Iterator[U]) func(Iterator[func(U) V]) Iterator[V] {
|
||||
func MonadAp[V, U any](fab Iterator[func(U) V], ma Iterator[U]) Iterator[V] {
|
||||
return G.MonadAp[Iterator[func(U) V], Iterator[V]](fab, ma)
|
||||
}
|
||||
|
||||
// Repeat creates an [Iterator] containing a value repeated the specified number of times.
|
||||
// Alias of [Replicate]
|
||||
func Repeat[U any](n int, a U) Iterator[U] {
|
||||
return G.Repeat[Iterator[U]](n, a)
|
||||
}
|
||||
|
||||
// Count creates an [Iterator] containing a consecutive sequence of integers starting with the provided start value
|
||||
func Count(start int) Iterator[int] {
|
||||
return G.Count[Iterator[int]](start)
|
||||
}
|
||||
|
||||
// FilterChain filters and transforms the content of an iterator
|
||||
func FilterChain[U, V any](f func(U) O.Option[Iterator[V]]) func(ma Iterator[U]) Iterator[V] {
|
||||
return G.FilterChain[Iterator[Iterator[V]], Iterator[V], Iterator[U]](f)
|
||||
}
|
||||
|
||||
// FoldMap maps and folds an iterator. Map the iterator passing each value to the iterating function. Then fold the results using the provided Monoid.
|
||||
func FoldMap[U, V any](m M.Monoid[V]) func(func(U) V) func(ma Iterator[U]) V {
|
||||
return G.FoldMap[Iterator[U], func(U) V, U, V](m)
|
||||
}
|
||||
|
||||
// Fold folds the iterator using the provided Monoid.
|
||||
func Fold[U any](m M.Monoid[U]) func(Iterator[U]) U {
|
||||
return G.Fold[Iterator[U]](m)
|
||||
}
|
||||
|
@@ -18,12 +18,14 @@ package stateless
|
||||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
A "github.com/IBM/fp-go/array"
|
||||
F "github.com/IBM/fp-go/function"
|
||||
"github.com/IBM/fp-go/internal/utils"
|
||||
O "github.com/IBM/fp-go/option"
|
||||
S "github.com/IBM/fp-go/string"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
@@ -76,8 +78,9 @@ func isPrimeNumber(num int) bool {
|
||||
|
||||
func TestFilterMap(t *testing.T) {
|
||||
|
||||
it := F.Pipe2(
|
||||
MakeBy(100, utils.Inc),
|
||||
it := F.Pipe3(
|
||||
MakeBy(utils.Inc),
|
||||
Take[int](100),
|
||||
FilterMap(O.FromPredicate(isPrimeNumber)),
|
||||
ToArray[int],
|
||||
)
|
||||
@@ -101,3 +104,14 @@ func TestAp(t *testing.T) {
|
||||
|
||||
assert.Equal(t, A.From("a-1-c", "a-1-d", "a-2-c", "a-2-d", "b-1-c", "b-1-d", "b-2-c", "b-2-d"), it)
|
||||
}
|
||||
|
||||
func ExampleFoldMap() {
|
||||
src := From("a", "b", "c")
|
||||
|
||||
fold := FoldMap[string](S.Monoid)(strings.ToUpper)
|
||||
|
||||
fmt.Println(fold(src))
|
||||
|
||||
// Output: ABC
|
||||
|
||||
}
|
||||
|
27
iterator/stateless/last.go
Normal file
27
iterator/stateless/last.go
Normal file
@@ -0,0 +1,27 @@
|
||||
// Copyright (c) 2023 IBM Corp.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package stateless
|
||||
|
||||
import (
|
||||
G "github.com/IBM/fp-go/iterator/stateless/generic"
|
||||
O "github.com/IBM/fp-go/option"
|
||||
)
|
||||
|
||||
// Last returns the last item in an iterator if such an item exists
|
||||
// Note that the function will consume the [Iterator] in this call completely, to identify the last element. Do not use this for infinite iterators
|
||||
func Last[U any](mu Iterator[U]) O.Option[U] {
|
||||
return G.Last[Iterator[U]](mu)
|
||||
}
|
41
iterator/stateless/last_test.go
Normal file
41
iterator/stateless/last_test.go
Normal file
@@ -0,0 +1,41 @@
|
||||
// Copyright (c) 2023 IBM Corp.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package stateless
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
O "github.com/IBM/fp-go/option"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestLast(t *testing.T) {
|
||||
|
||||
seq := From(1, 2, 3)
|
||||
|
||||
fst := Last(seq)
|
||||
|
||||
assert.Equal(t, O.Of(3), fst)
|
||||
}
|
||||
|
||||
func TestNoLast(t *testing.T) {
|
||||
|
||||
seq := Empty[int]()
|
||||
|
||||
fst := Last(seq)
|
||||
|
||||
assert.Equal(t, O.None[int](), fst)
|
||||
}
|
27
iterator/stateless/scan.go
Normal file
27
iterator/stateless/scan.go
Normal file
@@ -0,0 +1,27 @@
|
||||
// Copyright (c) 2023 IBM Corp.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package stateless
|
||||
|
||||
import (
|
||||
G "github.com/IBM/fp-go/iterator/stateless/generic"
|
||||
)
|
||||
|
||||
// Scan takes an [Iterator] and returns a new [Iterator] of the same length, where the values
|
||||
// of the new [Iterator] are the result of the application of `f` to the value of the
|
||||
// source iterator with the previously accumulated value
|
||||
func Scan[FCT ~func(V, U) V, U, V any](f FCT, initial V) func(ma Iterator[U]) Iterator[V] {
|
||||
return G.Scan[Iterator[V], Iterator[U], FCT](f, initial)
|
||||
}
|
42
iterator/stateless/scan_test.go
Normal file
42
iterator/stateless/scan_test.go
Normal file
@@ -0,0 +1,42 @@
|
||||
// Copyright (c) 2023 IBM Corp.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package stateless
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
F "github.com/IBM/fp-go/function"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestScan(t *testing.T) {
|
||||
|
||||
src := From("a", "b", "c")
|
||||
|
||||
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, "")),
|
||||
)
|
||||
|
||||
assert.Equal(t, ToArray(From(
|
||||
T.MakeTuple2(1, "a"),
|
||||
T.MakeTuple2(2, "b"),
|
||||
T.MakeTuple2(3, "c"),
|
||||
)), ToArray(dst))
|
||||
}
|
25
iterator/stateless/take.go
Normal file
25
iterator/stateless/take.go
Normal file
@@ -0,0 +1,25 @@
|
||||
// Copyright (c) 2023 IBM Corp.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package stateless
|
||||
|
||||
import (
|
||||
G "github.com/IBM/fp-go/iterator/stateless/generic"
|
||||
)
|
||||
|
||||
// Take limits the number of values in the [Iterator] to a maximum number
|
||||
func Take[U any](n int) func(ma Iterator[U]) Iterator[U] {
|
||||
return G.Take[Iterator[U]](n)
|
||||
}
|
37
iterator/stateless/take_test.go
Normal file
37
iterator/stateless/take_test.go
Normal file
@@ -0,0 +1,37 @@
|
||||
// Copyright (c) 2023 IBM Corp.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package stateless
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
A "github.com/IBM/fp-go/array"
|
||||
F "github.com/IBM/fp-go/function"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestTake(t *testing.T) {
|
||||
|
||||
total := MakeBy(F.Identity[int])
|
||||
|
||||
trimmed := F.Pipe1(
|
||||
total,
|
||||
Take[int](10),
|
||||
)
|
||||
|
||||
assert.Equal(t, A.MakeBy(10, F.Identity[int]), ToArray(trimmed))
|
||||
|
||||
}
|
32
iterator/stateless/uniq.go
Normal file
32
iterator/stateless/uniq.go
Normal file
@@ -0,0 +1,32 @@
|
||||
// Copyright (c) 2023 IBM Corp.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package stateless
|
||||
|
||||
import (
|
||||
G "github.com/IBM/fp-go/iterator/stateless/generic"
|
||||
)
|
||||
|
||||
// StrictUniq converts an [Iterator] or arbitrary items into an [Iterator] or unique items
|
||||
// where uniqueness is determined by the built-in uniqueness constraint
|
||||
func StrictUniq[A comparable](as Iterator[A]) Iterator[A] {
|
||||
return G.StrictUniq[Iterator[A]](as)
|
||||
}
|
||||
|
||||
// Uniq converts an [Iterator] or arbitrary items into an [Iterator] or unique items
|
||||
// where uniqueness is determined based on a key extractor function
|
||||
func Uniq[A any, K comparable](f func(A) K) func(as Iterator[A]) Iterator[A] {
|
||||
return G.Uniq[Iterator[A], K](f)
|
||||
}
|
31
iterator/stateless/uniq_test.go
Normal file
31
iterator/stateless/uniq_test.go
Normal file
@@ -0,0 +1,31 @@
|
||||
// Copyright (c) 2023 IBM Corp.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package stateless
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestUniq(t *testing.T) {
|
||||
// iterator with duplicate items
|
||||
dups := From(1, 2, 3, 1, 4, 5, 2)
|
||||
|
||||
u := StrictUniq(dups)
|
||||
|
||||
assert.Equal(t, ToArray(From(1, 2, 3, 4, 5)), ToArray(u))
|
||||
}
|
33
iterator/stateless/zip.go
Normal file
33
iterator/stateless/zip.go
Normal file
@@ -0,0 +1,33 @@
|
||||
// Copyright (c) 2023 IBM Corp.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package stateless
|
||||
|
||||
import (
|
||||
G "github.com/IBM/fp-go/iterator/stateless/generic"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
)
|
||||
|
||||
// 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[FCT ~func(A, B) C, A, B, C any](fa Iterator[A], fb Iterator[B], f FCT) Iterator[C] {
|
||||
return G.ZipWith[Iterator[A], Iterator[B], Iterator[C]](fa, fb, 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)
|
||||
}
|
44
iterator/stateless/zip_test.go
Normal file
44
iterator/stateless/zip_test.go
Normal file
@@ -0,0 +1,44 @@
|
||||
// Copyright (c) 2023 IBM Corp.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
package stateless
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"testing"
|
||||
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
func TestZipWith(t *testing.T) {
|
||||
left := From(1, 2, 3)
|
||||
right := From("a", "b", "c", "d")
|
||||
|
||||
res := ZipWith(left, right, func(l int, r string) string {
|
||||
return fmt.Sprintf("%s%d", r, l)
|
||||
})
|
||||
|
||||
assert.Equal(t, ToArray(From("a1", "b2", "c3")), ToArray(res))
|
||||
}
|
||||
|
||||
func TestZip(t *testing.T) {
|
||||
left := From(1, 2, 3)
|
||||
right := From("a", "b", "c", "d")
|
||||
|
||||
res := Zip[string](left)(right)
|
||||
|
||||
assert.Equal(t, ToArray(From(T.MakeTuple2("a", 1), T.MakeTuple2("b", 2), T.MakeTuple2("c", 3))), ToArray(res))
|
||||
}
|
@@ -19,14 +19,11 @@ type (
|
||||
// RecFct is the function called recursively
|
||||
RecFct[T, R any] func(T) R
|
||||
|
||||
// transformer
|
||||
Transformer[T, R any] func(RecFct[T, R]) RecFct[T, R]
|
||||
|
||||
internalCombinator[T, R any] func(internalCombinator[T, R]) RecFct[T, R]
|
||||
)
|
||||
|
||||
// Y is the Y-combinator based on https://dreamsongs.com/Files/WhyOfY.pdf
|
||||
func Y[T, R any](f Transformer[T, R]) RecFct[T, R] {
|
||||
func Y[TRFRM ~func(RecFct[T, R]) RecFct[T, R], T, R any](f TRFRM) RecFct[T, R] {
|
||||
g := func(h internalCombinator[T, R]) RecFct[T, R] {
|
||||
return func(t T) R {
|
||||
return f(h(h))(t)
|
||||
|
@@ -34,3 +34,19 @@ func Add[T Number](left T) func(T) T {
|
||||
func Inc[T Number](value T) T {
|
||||
return value + 1
|
||||
}
|
||||
|
||||
// Min takes the minimum of two values. If they are considered equal, the first argument is chosen
|
||||
func Min[A C.Ordered](a, b A) A {
|
||||
if a < b {
|
||||
return a
|
||||
}
|
||||
return b
|
||||
}
|
||||
|
||||
// Max takes the maximum of two values. If they are considered equal, the first argument is chosen
|
||||
func Max[A C.Ordered](a, b A) A {
|
||||
if a > b {
|
||||
return a
|
||||
}
|
||||
return b
|
||||
}
|
||||
|
@@ -15,14 +15,14 @@
|
||||
|
||||
// Code generated by go generate; DO NOT EDIT.
|
||||
// This file was generated by robots at
|
||||
// 2023-07-28 15:43:17.2891664 +0200 CEST m=+0.022524801
|
||||
// 2023-07-28 22:49:06.6236747 +0200 CEST m=+0.039283301
|
||||
package option
|
||||
|
||||
|
||||
import (
|
||||
A "github.com/IBM/fp-go/internal/apply"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
)
|
||||
|
||||
// optionize converts a nullary function to an option
|
||||
func optionize[R any](f func() (R, bool)) Option[R] {
|
||||
if r, ok := f(); ok {
|
||||
@@ -80,7 +80,7 @@ func SequenceTuple1[T1 any](t T.Tuple1[Option[T1]]) Option[T.Tuple1[T1]] {
|
||||
}
|
||||
|
||||
// TraverseTuple1 converts a [Tuple1] of [A] via transformation functions transforming [A] to [Option[A]] into a [Option[Tuple1]].
|
||||
func TraverseTuple1[F1 ~func(A1) Option[T1], A1, T1 any](f1 F1) func (T.Tuple1[A1]) Option[T.Tuple1[T1]] {
|
||||
func TraverseTuple1[F1 ~func(A1) Option[T1], A1, T1 any](f1 F1) func(T.Tuple1[A1]) Option[T.Tuple1[T1]] {
|
||||
return func(t T.Tuple1[A1]) Option[T.Tuple1[T1]] {
|
||||
return A.TraverseTuple1(
|
||||
Map[T1, T.Tuple1[T1]],
|
||||
@@ -126,7 +126,7 @@ func SequenceTuple2[T1, T2 any](t T.Tuple2[Option[T1], Option[T2]]) Option[T.Tup
|
||||
}
|
||||
|
||||
// TraverseTuple2 converts a [Tuple2] of [A] via transformation functions transforming [A] to [Option[A]] into a [Option[Tuple2]].
|
||||
func TraverseTuple2[F1 ~func(A1) Option[T1], F2 ~func(A2) Option[T2], A1, T1, A2, T2 any](f1 F1, f2 F2) func (T.Tuple2[A1, A2]) Option[T.Tuple2[T1, T2]] {
|
||||
func TraverseTuple2[F1 ~func(A1) Option[T1], F2 ~func(A2) Option[T2], A1, T1, A2, T2 any](f1 F1, f2 F2) func(T.Tuple2[A1, A2]) Option[T.Tuple2[T1, T2]] {
|
||||
return func(t T.Tuple2[A1, A2]) Option[T.Tuple2[T1, T2]] {
|
||||
return A.TraverseTuple2(
|
||||
Map[T1, func(T2) T.Tuple2[T1, T2]],
|
||||
@@ -177,7 +177,7 @@ func SequenceTuple3[T1, T2, T3 any](t T.Tuple3[Option[T1], Option[T2], Option[T3
|
||||
}
|
||||
|
||||
// TraverseTuple3 converts a [Tuple3] of [A] via transformation functions transforming [A] to [Option[A]] into a [Option[Tuple3]].
|
||||
func TraverseTuple3[F1 ~func(A1) Option[T1], F2 ~func(A2) Option[T2], F3 ~func(A3) Option[T3], A1, T1, A2, T2, A3, T3 any](f1 F1, f2 F2, f3 F3) func (T.Tuple3[A1, A2, A3]) Option[T.Tuple3[T1, T2, T3]] {
|
||||
func TraverseTuple3[F1 ~func(A1) Option[T1], F2 ~func(A2) Option[T2], F3 ~func(A3) Option[T3], A1, T1, A2, T2, A3, T3 any](f1 F1, f2 F2, f3 F3) func(T.Tuple3[A1, A2, A3]) Option[T.Tuple3[T1, T2, T3]] {
|
||||
return func(t T.Tuple3[A1, A2, A3]) Option[T.Tuple3[T1, T2, T3]] {
|
||||
return A.TraverseTuple3(
|
||||
Map[T1, func(T2) func(T3) T.Tuple3[T1, T2, T3]],
|
||||
@@ -233,7 +233,7 @@ func SequenceTuple4[T1, T2, T3, T4 any](t T.Tuple4[Option[T1], Option[T2], Optio
|
||||
}
|
||||
|
||||
// TraverseTuple4 converts a [Tuple4] of [A] via transformation functions transforming [A] to [Option[A]] into a [Option[Tuple4]].
|
||||
func TraverseTuple4[F1 ~func(A1) Option[T1], F2 ~func(A2) Option[T2], F3 ~func(A3) Option[T3], F4 ~func(A4) Option[T4], A1, T1, A2, T2, A3, T3, A4, T4 any](f1 F1, f2 F2, f3 F3, f4 F4) func (T.Tuple4[A1, A2, A3, A4]) Option[T.Tuple4[T1, T2, T3, T4]] {
|
||||
func TraverseTuple4[F1 ~func(A1) Option[T1], F2 ~func(A2) Option[T2], F3 ~func(A3) Option[T3], F4 ~func(A4) Option[T4], A1, T1, A2, T2, A3, T3, A4, T4 any](f1 F1, f2 F2, f3 F3, f4 F4) func(T.Tuple4[A1, A2, A3, A4]) Option[T.Tuple4[T1, T2, T3, T4]] {
|
||||
return func(t T.Tuple4[A1, A2, A3, A4]) Option[T.Tuple4[T1, T2, T3, T4]] {
|
||||
return A.TraverseTuple4(
|
||||
Map[T1, func(T2) func(T3) func(T4) T.Tuple4[T1, T2, T3, T4]],
|
||||
@@ -294,7 +294,7 @@ func SequenceTuple5[T1, T2, T3, T4, T5 any](t T.Tuple5[Option[T1], Option[T2], O
|
||||
}
|
||||
|
||||
// TraverseTuple5 converts a [Tuple5] of [A] via transformation functions transforming [A] to [Option[A]] into a [Option[Tuple5]].
|
||||
func TraverseTuple5[F1 ~func(A1) Option[T1], F2 ~func(A2) Option[T2], F3 ~func(A3) Option[T3], F4 ~func(A4) Option[T4], F5 ~func(A5) Option[T5], A1, T1, A2, T2, A3, T3, A4, T4, A5, T5 any](f1 F1, f2 F2, f3 F3, f4 F4, f5 F5) func (T.Tuple5[A1, A2, A3, A4, A5]) Option[T.Tuple5[T1, T2, T3, T4, T5]] {
|
||||
func TraverseTuple5[F1 ~func(A1) Option[T1], F2 ~func(A2) Option[T2], F3 ~func(A3) Option[T3], F4 ~func(A4) Option[T4], F5 ~func(A5) Option[T5], A1, T1, A2, T2, A3, T3, A4, T4, A5, T5 any](f1 F1, f2 F2, f3 F3, f4 F4, f5 F5) func(T.Tuple5[A1, A2, A3, A4, A5]) Option[T.Tuple5[T1, T2, T3, T4, T5]] {
|
||||
return func(t T.Tuple5[A1, A2, A3, A4, A5]) Option[T.Tuple5[T1, T2, T3, T4, T5]] {
|
||||
return A.TraverseTuple5(
|
||||
Map[T1, func(T2) func(T3) func(T4) func(T5) T.Tuple5[T1, T2, T3, T4, T5]],
|
||||
@@ -360,7 +360,7 @@ func SequenceTuple6[T1, T2, T3, T4, T5, T6 any](t T.Tuple6[Option[T1], Option[T2
|
||||
}
|
||||
|
||||
// TraverseTuple6 converts a [Tuple6] of [A] via transformation functions transforming [A] to [Option[A]] into a [Option[Tuple6]].
|
||||
func TraverseTuple6[F1 ~func(A1) Option[T1], F2 ~func(A2) Option[T2], F3 ~func(A3) Option[T3], F4 ~func(A4) Option[T4], F5 ~func(A5) Option[T5], F6 ~func(A6) Option[T6], A1, T1, A2, T2, A3, T3, A4, T4, A5, T5, A6, T6 any](f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6) func (T.Tuple6[A1, A2, A3, A4, A5, A6]) Option[T.Tuple6[T1, T2, T3, T4, T5, T6]] {
|
||||
func TraverseTuple6[F1 ~func(A1) Option[T1], F2 ~func(A2) Option[T2], F3 ~func(A3) Option[T3], F4 ~func(A4) Option[T4], F5 ~func(A5) Option[T5], F6 ~func(A6) Option[T6], A1, T1, A2, T2, A3, T3, A4, T4, A5, T5, A6, T6 any](f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6) func(T.Tuple6[A1, A2, A3, A4, A5, A6]) Option[T.Tuple6[T1, T2, T3, T4, T5, T6]] {
|
||||
return func(t T.Tuple6[A1, A2, A3, A4, A5, A6]) Option[T.Tuple6[T1, T2, T3, T4, T5, T6]] {
|
||||
return A.TraverseTuple6(
|
||||
Map[T1, func(T2) func(T3) func(T4) func(T5) func(T6) T.Tuple6[T1, T2, T3, T4, T5, T6]],
|
||||
@@ -431,7 +431,7 @@ func SequenceTuple7[T1, T2, T3, T4, T5, T6, T7 any](t T.Tuple7[Option[T1], Optio
|
||||
}
|
||||
|
||||
// TraverseTuple7 converts a [Tuple7] of [A] via transformation functions transforming [A] to [Option[A]] into a [Option[Tuple7]].
|
||||
func TraverseTuple7[F1 ~func(A1) Option[T1], F2 ~func(A2) Option[T2], F3 ~func(A3) Option[T3], F4 ~func(A4) Option[T4], F5 ~func(A5) Option[T5], F6 ~func(A6) Option[T6], F7 ~func(A7) Option[T7], A1, T1, A2, T2, A3, T3, A4, T4, A5, T5, A6, T6, A7, T7 any](f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6, f7 F7) func (T.Tuple7[A1, A2, A3, A4, A5, A6, A7]) Option[T.Tuple7[T1, T2, T3, T4, T5, T6, T7]] {
|
||||
func TraverseTuple7[F1 ~func(A1) Option[T1], F2 ~func(A2) Option[T2], F3 ~func(A3) Option[T3], F4 ~func(A4) Option[T4], F5 ~func(A5) Option[T5], F6 ~func(A6) Option[T6], F7 ~func(A7) Option[T7], A1, T1, A2, T2, A3, T3, A4, T4, A5, T5, A6, T6, A7, T7 any](f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6, f7 F7) func(T.Tuple7[A1, A2, A3, A4, A5, A6, A7]) Option[T.Tuple7[T1, T2, T3, T4, T5, T6, T7]] {
|
||||
return func(t T.Tuple7[A1, A2, A3, A4, A5, A6, A7]) Option[T.Tuple7[T1, T2, T3, T4, T5, T6, T7]] {
|
||||
return A.TraverseTuple7(
|
||||
Map[T1, func(T2) func(T3) func(T4) func(T5) func(T6) func(T7) T.Tuple7[T1, T2, T3, T4, T5, T6, T7]],
|
||||
@@ -507,7 +507,7 @@ func SequenceTuple8[T1, T2, T3, T4, T5, T6, T7, T8 any](t T.Tuple8[Option[T1], O
|
||||
}
|
||||
|
||||
// TraverseTuple8 converts a [Tuple8] of [A] via transformation functions transforming [A] to [Option[A]] into a [Option[Tuple8]].
|
||||
func TraverseTuple8[F1 ~func(A1) Option[T1], F2 ~func(A2) Option[T2], F3 ~func(A3) Option[T3], F4 ~func(A4) Option[T4], F5 ~func(A5) Option[T5], F6 ~func(A6) Option[T6], F7 ~func(A7) Option[T7], F8 ~func(A8) Option[T8], A1, T1, A2, T2, A3, T3, A4, T4, A5, T5, A6, T6, A7, T7, A8, T8 any](f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6, f7 F7, f8 F8) func (T.Tuple8[A1, A2, A3, A4, A5, A6, A7, A8]) Option[T.Tuple8[T1, T2, T3, T4, T5, T6, T7, T8]] {
|
||||
func TraverseTuple8[F1 ~func(A1) Option[T1], F2 ~func(A2) Option[T2], F3 ~func(A3) Option[T3], F4 ~func(A4) Option[T4], F5 ~func(A5) Option[T5], F6 ~func(A6) Option[T6], F7 ~func(A7) Option[T7], F8 ~func(A8) Option[T8], A1, T1, A2, T2, A3, T3, A4, T4, A5, T5, A6, T6, A7, T7, A8, T8 any](f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6, f7 F7, f8 F8) func(T.Tuple8[A1, A2, A3, A4, A5, A6, A7, A8]) Option[T.Tuple8[T1, T2, T3, T4, T5, T6, T7, T8]] {
|
||||
return func(t T.Tuple8[A1, A2, A3, A4, A5, A6, A7, A8]) Option[T.Tuple8[T1, T2, T3, T4, T5, T6, T7, T8]] {
|
||||
return A.TraverseTuple8(
|
||||
Map[T1, func(T2) func(T3) func(T4) func(T5) func(T6) func(T7) func(T8) T.Tuple8[T1, T2, T3, T4, T5, T6, T7, T8]],
|
||||
@@ -588,7 +588,7 @@ func SequenceTuple9[T1, T2, T3, T4, T5, T6, T7, T8, T9 any](t T.Tuple9[Option[T1
|
||||
}
|
||||
|
||||
// TraverseTuple9 converts a [Tuple9] of [A] via transformation functions transforming [A] to [Option[A]] into a [Option[Tuple9]].
|
||||
func TraverseTuple9[F1 ~func(A1) Option[T1], F2 ~func(A2) Option[T2], F3 ~func(A3) Option[T3], F4 ~func(A4) Option[T4], F5 ~func(A5) Option[T5], F6 ~func(A6) Option[T6], F7 ~func(A7) Option[T7], F8 ~func(A8) Option[T8], F9 ~func(A9) Option[T9], A1, T1, A2, T2, A3, T3, A4, T4, A5, T5, A6, T6, A7, T7, A8, T8, A9, T9 any](f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6, f7 F7, f8 F8, f9 F9) func (T.Tuple9[A1, A2, A3, A4, A5, A6, A7, A8, A9]) Option[T.Tuple9[T1, T2, T3, T4, T5, T6, T7, T8, T9]] {
|
||||
func TraverseTuple9[F1 ~func(A1) Option[T1], F2 ~func(A2) Option[T2], F3 ~func(A3) Option[T3], F4 ~func(A4) Option[T4], F5 ~func(A5) Option[T5], F6 ~func(A6) Option[T6], F7 ~func(A7) Option[T7], F8 ~func(A8) Option[T8], F9 ~func(A9) Option[T9], A1, T1, A2, T2, A3, T3, A4, T4, A5, T5, A6, T6, A7, T7, A8, T8, A9, T9 any](f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6, f7 F7, f8 F8, f9 F9) func(T.Tuple9[A1, A2, A3, A4, A5, A6, A7, A8, A9]) Option[T.Tuple9[T1, T2, T3, T4, T5, T6, T7, T8, T9]] {
|
||||
return func(t T.Tuple9[A1, A2, A3, A4, A5, A6, A7, A8, A9]) Option[T.Tuple9[T1, T2, T3, T4, T5, T6, T7, T8, T9]] {
|
||||
return A.TraverseTuple9(
|
||||
Map[T1, func(T2) func(T3) func(T4) func(T5) func(T6) func(T7) func(T8) func(T9) T.Tuple9[T1, T2, T3, T4, T5, T6, T7, T8, T9]],
|
||||
@@ -674,7 +674,7 @@ func SequenceTuple10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10 any](t T.Tuple10[Op
|
||||
}
|
||||
|
||||
// TraverseTuple10 converts a [Tuple10] of [A] via transformation functions transforming [A] to [Option[A]] into a [Option[Tuple10]].
|
||||
func TraverseTuple10[F1 ~func(A1) Option[T1], F2 ~func(A2) Option[T2], F3 ~func(A3) Option[T3], F4 ~func(A4) Option[T4], F5 ~func(A5) Option[T5], F6 ~func(A6) Option[T6], F7 ~func(A7) Option[T7], F8 ~func(A8) Option[T8], F9 ~func(A9) Option[T9], F10 ~func(A10) Option[T10], A1, T1, A2, T2, A3, T3, A4, T4, A5, T5, A6, T6, A7, T7, A8, T8, A9, T9, A10, T10 any](f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6, f7 F7, f8 F8, f9 F9, f10 F10) func (T.Tuple10[A1, A2, A3, A4, A5, A6, A7, A8, A9, A10]) Option[T.Tuple10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]] {
|
||||
func TraverseTuple10[F1 ~func(A1) Option[T1], F2 ~func(A2) Option[T2], F3 ~func(A3) Option[T3], F4 ~func(A4) Option[T4], F5 ~func(A5) Option[T5], F6 ~func(A6) Option[T6], F7 ~func(A7) Option[T7], F8 ~func(A8) Option[T8], F9 ~func(A9) Option[T9], F10 ~func(A10) Option[T10], A1, T1, A2, T2, A3, T3, A4, T4, A5, T5, A6, T6, A7, T7, A8, T8, A9, T9, A10, T10 any](f1 F1, f2 F2, f3 F3, f4 F4, f5 F5, f6 F6, f7 F7, f8 F8, f9 F9, f10 F10) func(T.Tuple10[A1, A2, A3, A4, A5, A6, A7, A8, A9, A10]) Option[T.Tuple10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]] {
|
||||
return func(t T.Tuple10[A1, A2, A3, A4, A5, A6, A7, A8, A9, A10]) Option[T.Tuple10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]] {
|
||||
return A.TraverseTuple10(
|
||||
Map[T1, func(T2) func(T3) func(T4) func(T5) func(T6) func(T7) func(T8) func(T9) func(T10) T.Tuple10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]],
|
||||
|
@@ -15,10 +15,9 @@
|
||||
|
||||
// Code generated by go generate; DO NOT EDIT.
|
||||
// This file was generated by robots at
|
||||
// 2023-07-28 15:43:24.9416992 +0200 CEST m=+0.030259001
|
||||
// 2023-07-28 22:49:14.4173227 +0200 CEST m=+0.013163201
|
||||
package reader
|
||||
|
||||
|
||||
import (
|
||||
G "github.com/IBM/fp-go/reader/generic"
|
||||
)
|
||||
|
@@ -15,10 +15,9 @@
|
||||
|
||||
// Code generated by go generate; DO NOT EDIT.
|
||||
// This file was generated by robots at
|
||||
// 2023-07-28 15:43:24.9574807 +0200 CEST m=+0.046040501
|
||||
// 2023-07-28 22:49:14.4173227 +0200 CEST m=+0.013163201
|
||||
package generic
|
||||
|
||||
|
||||
// From0 converts a function with 1 parameters returning a [R] into a function with 0 parameters returning a [GRA]
|
||||
// The first parameter is considered to be the context [C].
|
||||
func From0[GRA ~func(C) R, F ~func(C) R, C, R any](f F) func() GRA {
|
||||
|
@@ -15,10 +15,9 @@
|
||||
|
||||
// Code generated by go generate; DO NOT EDIT.
|
||||
// This file was generated by robots at
|
||||
// 2023-07-28 15:43:27.7019865 +0200 CEST m=+0.066240401
|
||||
// 2023-07-28 22:49:16.5272334 +0200 CEST m=+0.043108701
|
||||
package readerioeither
|
||||
|
||||
|
||||
import (
|
||||
G "github.com/IBM/fp-go/readerioeither/generic"
|
||||
)
|
||||
|
@@ -15,10 +15,9 @@
|
||||
|
||||
// Code generated by go generate; DO NOT EDIT.
|
||||
// This file was generated by robots at
|
||||
// 2023-07-28 15:43:27.7039855 +0200 CEST m=+0.068239401
|
||||
// 2023-07-28 22:49:16.5292332 +0200 CEST m=+0.045108501
|
||||
package generic
|
||||
|
||||
|
||||
import (
|
||||
E "github.com/IBM/fp-go/either"
|
||||
RD "github.com/IBM/fp-go/reader/generic"
|
||||
@@ -38,7 +37,8 @@ func Eitherize0[GRA ~func(C) GIOA, F ~func(C) (R, error), GIOA ~func() E.Either[
|
||||
return From0[GRA](func(r C) func() (R, error) {
|
||||
return func() (R, error) {
|
||||
return f(r)
|
||||
}})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// From1 converts a function with 2 parameters returning a tuple into a function with 1 parameters returning a [GRA]
|
||||
@@ -55,7 +55,8 @@ func Eitherize1[GRA ~func(C) GIOA, F ~func(C, T0) (R, error), GIOA ~func() E.Eit
|
||||
return From1[GRA](func(r C, t0 T0) func() (R, error) {
|
||||
return func() (R, error) {
|
||||
return f(r, t0)
|
||||
}})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// From2 converts a function with 3 parameters returning a tuple into a function with 2 parameters returning a [GRA]
|
||||
@@ -72,7 +73,8 @@ func Eitherize2[GRA ~func(C) GIOA, F ~func(C, T0, T1) (R, error), GIOA ~func() E
|
||||
return From2[GRA](func(r C, t0 T0, t1 T1) func() (R, error) {
|
||||
return func() (R, error) {
|
||||
return f(r, t0, t1)
|
||||
}})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// From3 converts a function with 4 parameters returning a tuple into a function with 3 parameters returning a [GRA]
|
||||
@@ -89,7 +91,8 @@ func Eitherize3[GRA ~func(C) GIOA, F ~func(C, T0, T1, T2) (R, error), GIOA ~func
|
||||
return From3[GRA](func(r C, t0 T0, t1 T1, t2 T2) func() (R, error) {
|
||||
return func() (R, error) {
|
||||
return f(r, t0, t1, t2)
|
||||
}})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// From4 converts a function with 5 parameters returning a tuple into a function with 4 parameters returning a [GRA]
|
||||
@@ -106,7 +109,8 @@ func Eitherize4[GRA ~func(C) GIOA, F ~func(C, T0, T1, T2, T3) (R, error), GIOA ~
|
||||
return From4[GRA](func(r C, t0 T0, t1 T1, t2 T2, t3 T3) func() (R, error) {
|
||||
return func() (R, error) {
|
||||
return f(r, t0, t1, t2, t3)
|
||||
}})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// From5 converts a function with 6 parameters returning a tuple into a function with 5 parameters returning a [GRA]
|
||||
@@ -123,7 +127,8 @@ func Eitherize5[GRA ~func(C) GIOA, F ~func(C, T0, T1, T2, T3, T4) (R, error), GI
|
||||
return From5[GRA](func(r C, t0 T0, t1 T1, t2 T2, t3 T3, t4 T4) func() (R, error) {
|
||||
return func() (R, error) {
|
||||
return f(r, t0, t1, t2, t3, t4)
|
||||
}})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// From6 converts a function with 7 parameters returning a tuple into a function with 6 parameters returning a [GRA]
|
||||
@@ -140,7 +145,8 @@ func Eitherize6[GRA ~func(C) GIOA, F ~func(C, T0, T1, T2, T3, T4, T5) (R, error)
|
||||
return From6[GRA](func(r C, t0 T0, t1 T1, t2 T2, t3 T3, t4 T4, t5 T5) func() (R, error) {
|
||||
return func() (R, error) {
|
||||
return f(r, t0, t1, t2, t3, t4, t5)
|
||||
}})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// From7 converts a function with 8 parameters returning a tuple into a function with 7 parameters returning a [GRA]
|
||||
@@ -157,7 +163,8 @@ func Eitherize7[GRA ~func(C) GIOA, F ~func(C, T0, T1, T2, T3, T4, T5, T6) (R, er
|
||||
return From7[GRA](func(r C, t0 T0, t1 T1, t2 T2, t3 T3, t4 T4, t5 T5, t6 T6) func() (R, error) {
|
||||
return func() (R, error) {
|
||||
return f(r, t0, t1, t2, t3, t4, t5, t6)
|
||||
}})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// From8 converts a function with 9 parameters returning a tuple into a function with 8 parameters returning a [GRA]
|
||||
@@ -174,7 +181,8 @@ func Eitherize8[GRA ~func(C) GIOA, F ~func(C, T0, T1, T2, T3, T4, T5, T6, T7) (R
|
||||
return From8[GRA](func(r C, t0 T0, t1 T1, t2 T2, t3 T3, t4 T4, t5 T5, t6 T6, t7 T7) func() (R, error) {
|
||||
return func() (R, error) {
|
||||
return f(r, t0, t1, t2, t3, t4, t5, t6, t7)
|
||||
}})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// From9 converts a function with 10 parameters returning a tuple into a function with 9 parameters returning a [GRA]
|
||||
@@ -191,7 +199,8 @@ func Eitherize9[GRA ~func(C) GIOA, F ~func(C, T0, T1, T2, T3, T4, T5, T6, T7, T8
|
||||
return From9[GRA](func(r C, t0 T0, t1 T1, t2 T2, t3 T3, t4 T4, t5 T5, t6 T6, t7 T7, t8 T8) func() (R, error) {
|
||||
return func() (R, error) {
|
||||
return f(r, t0, t1, t2, t3, t4, t5, t6, t7, t8)
|
||||
}})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// From10 converts a function with 11 parameters returning a tuple into a function with 10 parameters returning a [GRA]
|
||||
@@ -208,5 +217,6 @@ func Eitherize10[GRA ~func(C) GIOA, F ~func(C, T0, T1, T2, T3, T4, T5, T6, T7, T
|
||||
return From10[GRA](func(r C, t0 T0, t1 T1, t2 T2, t3 T3, t4 T4, t5 T5, t6 T6, t7 T7, t8 T8, t9 T9) func() (R, error) {
|
||||
return func() (R, error) {
|
||||
return f(r, t0, t1, t2, t3, t4, t5, t6, t7, t8, t9)
|
||||
}})
|
||||
}
|
||||
})
|
||||
}
|
||||
|
17
record/doc.go
Normal file
17
record/doc.go
Normal file
@@ -0,0 +1,17 @@
|
||||
// Copyright (c) 2023 IBM Corp.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
|
||||
// Package record contains monadic operations for maps as well as a rich set of utility functions
|
||||
package record
|
@@ -16,6 +16,7 @@
|
||||
package generic
|
||||
|
||||
import (
|
||||
F "github.com/IBM/fp-go/function"
|
||||
M "github.com/IBM/fp-go/monoid"
|
||||
S "github.com/IBM/fp-go/semigroup"
|
||||
)
|
||||
@@ -26,3 +27,17 @@ func UnionMonoid[N ~map[K]V, K comparable, V any](s S.Semigroup[V]) M.Monoid[N]
|
||||
Empty[N](),
|
||||
)
|
||||
}
|
||||
|
||||
func UnionLastMonoid[N ~map[K]V, K comparable, V any]() M.Monoid[N] {
|
||||
return M.MakeMonoid(
|
||||
unionLast[N],
|
||||
Empty[N](),
|
||||
)
|
||||
}
|
||||
|
||||
func UnionFirstMonoid[N ~map[K]V, K comparable, V any]() M.Monoid[N] {
|
||||
return M.MakeMonoid(
|
||||
F.Swap(unionLast[N]),
|
||||
Empty[N](),
|
||||
)
|
||||
}
|
||||
|
@@ -16,10 +16,14 @@
|
||||
package generic
|
||||
|
||||
import (
|
||||
"sort"
|
||||
|
||||
F "github.com/IBM/fp-go/function"
|
||||
G "github.com/IBM/fp-go/internal/record"
|
||||
Mg "github.com/IBM/fp-go/magma"
|
||||
Mo "github.com/IBM/fp-go/monoid"
|
||||
O "github.com/IBM/fp-go/option"
|
||||
"github.com/IBM/fp-go/ord"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
)
|
||||
|
||||
@@ -39,6 +43,46 @@ func Values[M ~map[K]V, GV ~[]V, K comparable, V any](r M) GV {
|
||||
return collect[M, GV](r, F.Second[K, V])
|
||||
}
|
||||
|
||||
func KeysOrd[M ~map[K]V, GK ~[]K, K comparable, V any](o ord.Ord[K]) func(r M) GK {
|
||||
return func(r M) GK {
|
||||
return collectOrd[M, GK](o, r, F.First[K, V])
|
||||
}
|
||||
}
|
||||
|
||||
func ValuesOrd[M ~map[K]V, GV ~[]V, K comparable, V any](o ord.Ord[K]) func(r M) GV {
|
||||
return func(r M) GV {
|
||||
return collectOrd[M, GV](o, r, F.Second[K, V])
|
||||
}
|
||||
}
|
||||
|
||||
func collectOrd[M ~map[K]V, GR ~[]R, K comparable, V, R any](o ord.Ord[K], r M, f func(K, V) R) GR {
|
||||
// create the entries
|
||||
entries := toEntriesOrd[M, []T.Tuple2[K, V]](o, r)
|
||||
// collect this array
|
||||
ft := T.Tupled2(f)
|
||||
count := len(entries)
|
||||
result := make(GR, count)
|
||||
for i := count - 1; i >= 0; i-- {
|
||||
result[i] = ft(entries[i])
|
||||
}
|
||||
// done
|
||||
return result
|
||||
}
|
||||
|
||||
func reduceOrd[M ~map[K]V, K comparable, V, R any](o ord.Ord[K], r M, f func(K, R, V) R, initial R) R {
|
||||
// create the entries
|
||||
entries := toEntriesOrd[M, []T.Tuple2[K, V]](o, r)
|
||||
// collect this array
|
||||
current := initial
|
||||
count := len(entries)
|
||||
for i := 0; i < count; i++ {
|
||||
t := entries[i]
|
||||
current = f(T.First(t), current, T.Second(t))
|
||||
}
|
||||
// done
|
||||
return current
|
||||
}
|
||||
|
||||
func collect[M ~map[K]V, GR ~[]R, K comparable, V, R any](r M, f func(K, V) R) GR {
|
||||
count := len(r)
|
||||
result := make(GR, count)
|
||||
@@ -82,6 +126,34 @@ func MonadMap[M ~map[K]V, N ~map[K]R, K comparable, V, R any](r M, f func(V) R)
|
||||
return MonadMapWithIndex[M, N](r, F.Ignore1of2[K](f))
|
||||
}
|
||||
|
||||
func MonadChainWithIndex[M ~map[K]V1, N ~map[K]V2, K comparable, V1, V2 any](m Mo.Monoid[N], r M, f func(K, V1) N) N {
|
||||
return G.ReduceWithIndex(r, func(k K, dst N, b V1) N {
|
||||
return m.Concat(dst, f(k, b))
|
||||
}, m.Empty())
|
||||
}
|
||||
|
||||
func MonadChain[M ~map[K]V1, N ~map[K]V2, K comparable, V1, V2 any](m Mo.Monoid[N], r M, f func(V1) N) N {
|
||||
return G.Reduce(r, func(dst N, b V1) N {
|
||||
return m.Concat(dst, f(b))
|
||||
}, m.Empty())
|
||||
}
|
||||
|
||||
func ChainWithIndex[M ~map[K]V1, N ~map[K]V2, K comparable, V1, V2 any](m Mo.Monoid[N]) func(func(K, V1) N) func(M) N {
|
||||
return func(f func(K, V1) N) func(M) N {
|
||||
return func(ma M) N {
|
||||
return MonadChainWithIndex(m, ma, f)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func Chain[M ~map[K]V1, N ~map[K]V2, K comparable, V1, V2 any](m Mo.Monoid[N]) func(func(V1) N) func(M) N {
|
||||
return func(f func(V1) N) func(M) N {
|
||||
return func(ma M) N {
|
||||
return MonadChain(m, ma, f)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func MonadMapWithIndex[M ~map[K]V, N ~map[K]R, K comparable, V, R any](r M, f func(K, V) R) N {
|
||||
return G.ReduceWithIndex(r, func(k K, dst N, v V) N {
|
||||
return upsertAtReadWrite(dst, k, f(k, v))
|
||||
@@ -114,15 +186,14 @@ func MapRefWithIndex[M ~map[K]V, N ~map[K]R, K comparable, V, R any](f func(K, *
|
||||
return F.Bind2nd(MonadMapRefWithIndex[M, N, K, V, R], f)
|
||||
}
|
||||
|
||||
func lookup[M ~map[K]V, K comparable, V any](r M, k K) O.Option[V] {
|
||||
if val, ok := r[k]; ok {
|
||||
func Lookup[M ~map[K]V, K comparable, V any](k K) func(M) O.Option[V] {
|
||||
n := O.None[V]()
|
||||
return func(m M) O.Option[V] {
|
||||
if val, ok := m[k]; ok {
|
||||
return O.Some(val)
|
||||
}
|
||||
return O.None[V]()
|
||||
}
|
||||
|
||||
func Lookup[M ~map[K]V, K comparable, V any](k K) func(M) O.Option[V] {
|
||||
return F.Bind2nd(lookup[M, K, V], k)
|
||||
return n
|
||||
}
|
||||
}
|
||||
|
||||
func Has[M ~map[K]V, K comparable, V any](k K, r M) bool {
|
||||
@@ -161,6 +232,31 @@ func union[M ~map[K]V, K comparable, V any](m Mg.Magma[V], left M, right M) M {
|
||||
return result
|
||||
}
|
||||
|
||||
func unionLast[M ~map[K]V, K comparable, V any](left M, right M) M {
|
||||
lenLeft := len(left)
|
||||
|
||||
if lenLeft == 0 {
|
||||
return right
|
||||
}
|
||||
|
||||
lenRight := len(right)
|
||||
if lenRight == 0 {
|
||||
return left
|
||||
}
|
||||
|
||||
result := make(M, lenLeft+lenRight)
|
||||
|
||||
for k, v := range left {
|
||||
result[k] = v
|
||||
}
|
||||
|
||||
for k, v := range right {
|
||||
result[k] = v
|
||||
}
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
func Union[M ~map[K]V, K comparable, V any](m Mg.Magma[V]) func(M) func(M) M {
|
||||
return func(right M) func(M) M {
|
||||
return func(left M) M {
|
||||
@@ -169,6 +265,22 @@ func Union[M ~map[K]V, K comparable, V any](m Mg.Magma[V]) func(M) func(M) M {
|
||||
}
|
||||
}
|
||||
|
||||
func UnionLast[M ~map[K]V, K comparable, V any](right M) func(M) M {
|
||||
return func(left M) M {
|
||||
return unionLast(left, right)
|
||||
}
|
||||
}
|
||||
|
||||
func Merge[M ~map[K]V, K comparable, V any](right M) func(M) M {
|
||||
return UnionLast(right)
|
||||
}
|
||||
|
||||
func UnionFirst[M ~map[K]V, K comparable, V any](right M) func(M) M {
|
||||
return func(left M) M {
|
||||
return unionLast(right, left)
|
||||
}
|
||||
}
|
||||
|
||||
func Empty[M ~map[K]V, K comparable, V any]() M {
|
||||
return make(M)
|
||||
}
|
||||
@@ -181,6 +293,27 @@ func ToArray[M ~map[K]V, GT ~[]T.Tuple2[K, V], K comparable, V any](r M) GT {
|
||||
return collect[M, GT](r, T.MakeTuple2[K, V])
|
||||
}
|
||||
|
||||
func toEntriesOrd[M ~map[K]V, GT ~[]T.Tuple2[K, V], K comparable, V any](o ord.Ord[K], r M) GT {
|
||||
// total number of elements
|
||||
count := len(r)
|
||||
// produce an array that we can sort by key
|
||||
entries := make(GT, count)
|
||||
idx := 0
|
||||
for k, v := range r {
|
||||
entries[idx] = T.MakeTuple2(k, v)
|
||||
idx++
|
||||
}
|
||||
sort.Slice(entries, func(i, j int) bool {
|
||||
return o.Compare(T.First(entries[i]), T.First(entries[j])) < 0
|
||||
})
|
||||
// final entries
|
||||
return entries
|
||||
}
|
||||
|
||||
func ToEntriesOrd[M ~map[K]V, GT ~[]T.Tuple2[K, V], K comparable, V any](o ord.Ord[K]) func(r M) GT {
|
||||
return F.Bind1st(toEntriesOrd[M, GT, K, V], o)
|
||||
}
|
||||
|
||||
func ToEntries[M ~map[K]V, GT ~[]T.Tuple2[K, V], K comparable, V any](r M) GT {
|
||||
return ToArray[M, GT](r)
|
||||
}
|
||||
@@ -269,6 +402,33 @@ func FilterMap[M ~map[K]V1, N ~map[K]V2, K comparable, V1, V2 any](f func(V1) O.
|
||||
return F.Bind2nd(filterMapWithIndex[M, N, K, V1, V2], F.Ignore1of2[K](f))
|
||||
}
|
||||
|
||||
// Flatten converts a nested map into a regular map
|
||||
func Flatten[M ~map[K]N, N ~map[K]V, K comparable, V any](m Mo.Monoid[N]) func(M) N {
|
||||
return Chain[M, N](m)(F.Identity[N])
|
||||
}
|
||||
|
||||
// FilterChainWithIndex creates a new map with only the elements for which the transformation function creates a Some
|
||||
func FilterChainWithIndex[M ~map[K]V1, N ~map[K]V2, K comparable, V1, V2 any](m Mo.Monoid[N]) func(func(K, V1) O.Option[N]) func(M) N {
|
||||
flatten := Flatten[map[K]N, N](m)
|
||||
return func(f func(K, V1) O.Option[N]) func(M) N {
|
||||
return F.Flow2(
|
||||
FilterMapWithIndex[M, map[K]N](f),
|
||||
flatten,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
// FilterChain creates a new map with only the elements for which the transformation function creates a Some
|
||||
func FilterChain[M ~map[K]V1, N ~map[K]V2, K comparable, V1, V2 any](m Mo.Monoid[N]) func(func(V1) O.Option[N]) func(M) N {
|
||||
flatten := Flatten[map[K]N, N](m)
|
||||
return func(f func(V1) O.Option[N]) func(M) N {
|
||||
return F.Flow2(
|
||||
FilterMap[M, map[K]N](f),
|
||||
flatten,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
// IsNil checks if the map is set to nil
|
||||
func IsNil[M ~map[K]V, K comparable, V any](m M) bool {
|
||||
return m == nil
|
||||
@@ -283,3 +443,67 @@ func IsNonNil[M ~map[K]V, K comparable, V any](m M) bool {
|
||||
func ConstNil[M ~map[K]V, K comparable, V any]() M {
|
||||
return (M)(nil)
|
||||
}
|
||||
|
||||
func FoldMap[AS ~map[K]A, K comparable, A, B any](m Mo.Monoid[B]) func(func(A) B) func(AS) B {
|
||||
return func(f func(A) B) func(AS) B {
|
||||
return Reduce[AS](func(cur B, a A) B {
|
||||
return m.Concat(cur, f(a))
|
||||
}, m.Empty())
|
||||
}
|
||||
}
|
||||
|
||||
func Fold[AS ~map[K]A, K comparable, A any](m Mo.Monoid[A]) func(AS) A {
|
||||
return Reduce[AS](m.Concat, m.Empty())
|
||||
}
|
||||
|
||||
func FoldMapWithIndex[AS ~map[K]A, K comparable, A, B any](m Mo.Monoid[B]) func(func(K, A) B) func(AS) B {
|
||||
return func(f func(K, A) B) func(AS) B {
|
||||
return ReduceWithIndex[AS](func(k K, cur B, a A) B {
|
||||
return m.Concat(cur, f(k, a))
|
||||
}, m.Empty())
|
||||
}
|
||||
}
|
||||
|
||||
func ReduceOrdWithIndex[M ~map[K]V, K comparable, V, R any](o ord.Ord[K]) func(func(K, R, V) R, R) func(M) R {
|
||||
return func(f func(K, R, V) R, initial R) func(M) R {
|
||||
return func(m M) R {
|
||||
return reduceOrd(o, m, f, initial)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func ReduceOrd[M ~map[K]V, K comparable, V, R any](o ord.Ord[K]) func(func(R, V) R, R) func(M) R {
|
||||
ro := ReduceOrdWithIndex[M, K, V, R](o)
|
||||
return func(f func(R, V) R, initial R) func(M) R {
|
||||
return ro(F.Ignore1of3[K](f), initial)
|
||||
}
|
||||
}
|
||||
|
||||
func FoldMapOrd[AS ~map[K]A, K comparable, A, B any](o ord.Ord[K]) func(m Mo.Monoid[B]) func(func(A) B) func(AS) B {
|
||||
red := ReduceOrd[AS, K, A, B](o)
|
||||
return func(m Mo.Monoid[B]) func(func(A) B) func(AS) B {
|
||||
return func(f func(A) B) func(AS) B {
|
||||
return red(func(cur B, a A) B {
|
||||
return m.Concat(cur, f(a))
|
||||
}, m.Empty())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func FoldOrd[AS ~map[K]A, K comparable, A any](o ord.Ord[K]) func(m Mo.Monoid[A]) func(AS) A {
|
||||
red := ReduceOrd[AS, K, A, A](o)
|
||||
return func(m Mo.Monoid[A]) func(AS) A {
|
||||
return red(m.Concat, m.Empty())
|
||||
}
|
||||
}
|
||||
|
||||
func FoldMapOrdWithIndex[AS ~map[K]A, K comparable, A, B any](o ord.Ord[K]) func(m Mo.Monoid[B]) func(func(K, A) B) func(AS) B {
|
||||
red := ReduceOrdWithIndex[AS, K, A, B](o)
|
||||
return func(m Mo.Monoid[B]) func(func(K, A) B) func(AS) B {
|
||||
return func(f func(K, A) B) func(AS) B {
|
||||
return red(func(k K, cur B, a A) B {
|
||||
return m.Concat(cur, f(k, a))
|
||||
}, m.Empty())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -20,8 +20,19 @@ import (
|
||||
)
|
||||
|
||||
func UnionSemigroup[N ~map[K]V, K comparable, V any](s S.Semigroup[V]) S.Semigroup[N] {
|
||||
union := Union[N, K, V](s)
|
||||
return S.MakeSemigroup(func(first N, second N) N {
|
||||
return union(second)(first)
|
||||
return union[N, K, V](S.ToMagma(s), first, second)
|
||||
})
|
||||
}
|
||||
|
||||
func UnionLastSemigroup[N ~map[K]V, K comparable, V any]() S.Semigroup[N] {
|
||||
return S.MakeSemigroup(func(first N, second N) N {
|
||||
return unionLast[N, K, V](first, second)
|
||||
})
|
||||
}
|
||||
|
||||
func UnionFirstSemigroup[N ~map[K]V, K comparable, V any]() S.Semigroup[N] {
|
||||
return S.MakeSemigroup(func(first N, second N) N {
|
||||
return unionLast[N, K, V](second, first)
|
||||
})
|
||||
}
|
||||
|
@@ -21,6 +21,22 @@ import (
|
||||
S "github.com/IBM/fp-go/semigroup"
|
||||
)
|
||||
|
||||
// UnionMonoid computes the union of two maps of the same type
|
||||
func UnionMonoid[K comparable, V any](s S.Semigroup[V]) M.Monoid[map[K]V] {
|
||||
return G.UnionMonoid[map[K]V](s)
|
||||
}
|
||||
|
||||
// UnionLastMonoid computes the union of two maps of the same type giving the last map precedence
|
||||
func UnionLastMonoid[K comparable, V any]() M.Monoid[map[K]V] {
|
||||
return G.UnionLastMonoid[map[K]V]()
|
||||
}
|
||||
|
||||
// UnionFirstMonoid computes the union of two maps of the same type giving the first map precedence
|
||||
func UnionFirstMonoid[K comparable, V any]() M.Monoid[map[K]V] {
|
||||
return G.UnionFirstMonoid[map[K]V]()
|
||||
}
|
||||
|
||||
// MergeMonoid computes the union of two maps of the same type giving the last map precedence
|
||||
func MergeMonoid[K comparable, V any]() M.Monoid[map[K]V] {
|
||||
return G.UnionLastMonoid[map[K]V]()
|
||||
}
|
||||
|
@@ -17,27 +17,34 @@ package record
|
||||
|
||||
import (
|
||||
Mg "github.com/IBM/fp-go/magma"
|
||||
Mo "github.com/IBM/fp-go/monoid"
|
||||
O "github.com/IBM/fp-go/option"
|
||||
"github.com/IBM/fp-go/ord"
|
||||
G "github.com/IBM/fp-go/record/generic"
|
||||
T "github.com/IBM/fp-go/tuple"
|
||||
)
|
||||
|
||||
// IsEmpty tests if a map is empty
|
||||
func IsEmpty[K comparable, V any](r map[K]V) bool {
|
||||
return G.IsEmpty(r)
|
||||
}
|
||||
|
||||
// IsNonEmpty tests if a map is not empty
|
||||
func IsNonEmpty[K comparable, V any](r map[K]V) bool {
|
||||
return G.IsNonEmpty(r)
|
||||
}
|
||||
|
||||
// Keys returns the key in a map
|
||||
func Keys[K comparable, V any](r map[K]V) []K {
|
||||
return G.Keys[map[K]V, []K](r)
|
||||
}
|
||||
|
||||
// Values returns the values in a map
|
||||
func Values[K comparable, V any](r map[K]V) []V {
|
||||
return G.Values[map[K]V, []V](r)
|
||||
}
|
||||
|
||||
// Collect applies a collector function to the key value pairs in a map and returns the result as an array
|
||||
func Collect[K comparable, V, R any](f func(K, V) R) func(map[K]V) []R {
|
||||
return G.Collect[map[K]V, []R](f)
|
||||
}
|
||||
@@ -90,10 +97,12 @@ func MapRefWithIndex[K comparable, V, R any](f func(K, *V) R) func(map[K]V) map[
|
||||
return G.MapRefWithIndex[map[K]V, map[K]R](f)
|
||||
}
|
||||
|
||||
// Lookup returns the entry for a key in a map if it exists
|
||||
func Lookup[K comparable, V any](k K) func(map[K]V) O.Option[V] {
|
||||
return G.Lookup[map[K]V](k)
|
||||
}
|
||||
|
||||
// Has tests if a key is contained in a map
|
||||
func Has[K comparable, V any](k K, r map[K]V) bool {
|
||||
return G.Has(k, r)
|
||||
}
|
||||
@@ -102,10 +111,17 @@ func Union[K comparable, V any](m Mg.Magma[V]) func(map[K]V) func(map[K]V) map[K
|
||||
return G.Union[map[K]V](m)
|
||||
}
|
||||
|
||||
// Merge combines two maps giving the values in the right one precedence. Also refer to [MergeMonoid]
|
||||
func Merge[K comparable, V any](right map[K]V) func(map[K]V) map[K]V {
|
||||
return G.Merge[map[K]V](right)
|
||||
}
|
||||
|
||||
// Empty creates an empty map
|
||||
func Empty[K comparable, V any]() map[K]V {
|
||||
return G.Empty[map[K]V]()
|
||||
}
|
||||
|
||||
// Size returns the number of elements in a map
|
||||
func Size[K comparable, V any](r map[K]V) int {
|
||||
return G.Size(r)
|
||||
}
|
||||
@@ -130,6 +146,7 @@ func DeleteAt[K comparable, V any](k K) func(map[K]V) map[K]V {
|
||||
return G.DeleteAt[map[K]V](k)
|
||||
}
|
||||
|
||||
// Singleton creates a new map with a single entry
|
||||
func Singleton[K comparable, V any](k K, v V) map[K]V {
|
||||
return G.Singleton[map[K]V](k, v)
|
||||
}
|
||||
@@ -168,3 +185,84 @@ func IsNonNil[K comparable, V any](m map[K]V) bool {
|
||||
func ConstNil[K comparable, V any]() map[K]V {
|
||||
return (map[K]V)(nil)
|
||||
}
|
||||
|
||||
func MonadChainWithIndex[V1 any, K comparable, V2 any](m Mo.Monoid[map[K]V2], r map[K]V1, f func(K, V1) map[K]V2) map[K]V2 {
|
||||
return G.MonadChainWithIndex(m, r, f)
|
||||
}
|
||||
|
||||
func MonadChain[V1 any, K comparable, V2 any](m Mo.Monoid[map[K]V2], r map[K]V1, f func(V1) map[K]V2) map[K]V2 {
|
||||
return G.MonadChain(m, r, f)
|
||||
}
|
||||
|
||||
func ChainWithIndex[V1 any, K comparable, V2 any](m Mo.Monoid[map[K]V2]) func(func(K, V1) map[K]V2) func(map[K]V1) map[K]V2 {
|
||||
return G.ChainWithIndex[map[K]V1](m)
|
||||
}
|
||||
|
||||
func Chain[V1 any, K comparable, V2 any](m Mo.Monoid[map[K]V2]) func(func(V1) map[K]V2) func(map[K]V1) map[K]V2 {
|
||||
return G.Chain[map[K]V1](m)
|
||||
}
|
||||
|
||||
// Flatten converts a nested map into a regular map
|
||||
func Flatten[K comparable, V any](m Mo.Monoid[map[K]V]) func(map[K]map[K]V) map[K]V {
|
||||
return G.Flatten[map[K]map[K]V](m)
|
||||
}
|
||||
|
||||
// FilterChainWithIndex creates a new map with only the elements for which the transformation function creates a Some
|
||||
func FilterChainWithIndex[V1 any, K comparable, V2 any](m Mo.Monoid[map[K]V2]) func(func(K, V1) O.Option[map[K]V2]) func(map[K]V1) map[K]V2 {
|
||||
return G.FilterChainWithIndex[map[K]V1](m)
|
||||
}
|
||||
|
||||
// FilterChain creates a new map with only the elements for which the transformation function creates a Some
|
||||
func FilterChain[V1 any, K comparable, V2 any](m Mo.Monoid[map[K]V2]) func(func(V1) O.Option[map[K]V2]) func(map[K]V1) map[K]V2 {
|
||||
return G.FilterChain[map[K]V1](m)
|
||||
}
|
||||
|
||||
// FoldMap maps and folds a record. Map the record passing each value to the iterating function. Then fold the results using the provided Monoid.
|
||||
func FoldMap[K comparable, A, B any](m Mo.Monoid[B]) func(func(A) B) func(map[K]A) B {
|
||||
return G.FoldMap[map[K]A](m)
|
||||
}
|
||||
|
||||
// FoldMapWithIndex maps and folds a record. Map the record passing each value to the iterating function. Then fold the results using the provided Monoid.
|
||||
func FoldMapWithIndex[K comparable, A, B any](m Mo.Monoid[B]) func(func(K, A) B) func(map[K]A) B {
|
||||
return G.FoldMapWithIndex[map[K]A](m)
|
||||
}
|
||||
|
||||
// Fold folds the record using the provided Monoid.
|
||||
func Fold[K comparable, A any](m Mo.Monoid[A]) func(map[K]A) A {
|
||||
return G.Fold[map[K]A](m)
|
||||
}
|
||||
|
||||
// ReduceOrdWithIndex reduces a map into a single value via a reducer function making sure that the keys are passed to the reducer in the specified order
|
||||
func ReduceOrdWithIndex[V, R any, K comparable](o ord.Ord[K]) func(func(K, R, V) R, R) func(map[K]V) R {
|
||||
return G.ReduceOrdWithIndex[map[K]V, K, V, R](o)
|
||||
}
|
||||
|
||||
// ReduceOrd reduces a map into a single value via a reducer function making sure that the keys are passed to the reducer in the specified order
|
||||
func ReduceOrd[V, R any, K comparable](o ord.Ord[K]) func(func(R, V) R, R) func(map[K]V) R {
|
||||
return G.ReduceOrd[map[K]V, K, V, R](o)
|
||||
}
|
||||
|
||||
// FoldMap maps and folds a record. Map the record passing each value to the iterating function. Then fold the results using the provided Monoid and the items in the provided order
|
||||
func FoldMapOrd[A, B any, K comparable](o ord.Ord[K]) func(m Mo.Monoid[B]) func(func(A) B) func(map[K]A) B {
|
||||
return G.FoldMapOrd[map[K]A, K, A, B](o)
|
||||
}
|
||||
|
||||
// Fold folds the record using the provided Monoid with the items passed in the given order
|
||||
func FoldOrd[A any, K comparable](o ord.Ord[K]) func(m Mo.Monoid[A]) func(map[K]A) A {
|
||||
return G.FoldOrd[map[K]A, K, A](o)
|
||||
}
|
||||
|
||||
// FoldMapWithIndex maps and folds a record. Map the record passing each value to the iterating function. Then fold the results using the provided Monoid and the items in the provided order
|
||||
func FoldMapOrdWithIndex[K comparable, A, B any](o ord.Ord[K]) func(m Mo.Monoid[B]) func(func(K, A) B) func(map[K]A) B {
|
||||
return G.FoldMapOrdWithIndex[map[K]A, K, A, B](o)
|
||||
}
|
||||
|
||||
// KeysOrd returns the keys in the map in their given order
|
||||
func KeysOrd[V any, K comparable](o ord.Ord[K]) func(r map[K]V) []K {
|
||||
return G.KeysOrd[map[K]V, []K, K, V](o)
|
||||
}
|
||||
|
||||
// ValuesOrd returns the values in the map ordered by their keys in the given order
|
||||
func ValuesOrd[V any, K comparable](o ord.Ord[K]) func(r map[K]V) []V {
|
||||
return G.ValuesOrd[map[K]V, []V, K, V](o)
|
||||
}
|
||||
|
@@ -16,11 +16,14 @@
|
||||
package record
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"sort"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/IBM/fp-go/internal/utils"
|
||||
O "github.com/IBM/fp-go/option"
|
||||
S "github.com/IBM/fp-go/string"
|
||||
"github.com/stretchr/testify/assert"
|
||||
)
|
||||
|
||||
@@ -71,3 +74,60 @@ func TestLookup(t *testing.T) {
|
||||
assert.Equal(t, O.Some("a"), Lookup[string, string]("a")(data))
|
||||
assert.Equal(t, O.None[string](), Lookup[string, string]("a1")(data))
|
||||
}
|
||||
|
||||
func TestFilterChain(t *testing.T) {
|
||||
src := map[string]int{
|
||||
"a": 1,
|
||||
"b": 2,
|
||||
"c": 3,
|
||||
}
|
||||
|
||||
f := func(k string, value int) O.Option[map[string]string] {
|
||||
if value%2 != 0 {
|
||||
return O.Of(map[string]string{
|
||||
k: fmt.Sprintf("%s%d", k, value),
|
||||
})
|
||||
}
|
||||
return O.None[map[string]string]()
|
||||
}
|
||||
|
||||
// monoid
|
||||
monoid := MergeMonoid[string, string]()
|
||||
|
||||
res := FilterChainWithIndex[int](monoid)(f)(src)
|
||||
|
||||
assert.Equal(t, map[string]string{
|
||||
"a": "a1",
|
||||
"c": "c3",
|
||||
}, res)
|
||||
}
|
||||
|
||||
func ExampleFoldMap() {
|
||||
src := map[string]string{
|
||||
"a": "a",
|
||||
"b": "b",
|
||||
"c": "c",
|
||||
}
|
||||
|
||||
fold := FoldMap[string, string](S.Monoid)(strings.ToUpper)
|
||||
|
||||
fmt.Println(fold(src))
|
||||
|
||||
// Output: ABC
|
||||
|
||||
}
|
||||
|
||||
func ExampleValuesOrd() {
|
||||
src := map[string]string{
|
||||
"c": "a",
|
||||
"b": "b",
|
||||
"a": "c",
|
||||
}
|
||||
|
||||
getValues := ValuesOrd[string](S.Ord)
|
||||
|
||||
fmt.Println(getValues(src))
|
||||
|
||||
// Output: [c b a]
|
||||
|
||||
}
|
||||
|
@@ -22,3 +22,11 @@ import (
|
||||
func UnionSemigroup[K comparable, V any](s S.Semigroup[V]) S.Semigroup[map[K]V] {
|
||||
return G.UnionSemigroup[map[K]V](s)
|
||||
}
|
||||
|
||||
func UnionLastSemigroup[K comparable, V any]() S.Semigroup[map[K]V] {
|
||||
return G.UnionLastSemigroup[map[K]V]()
|
||||
}
|
||||
|
||||
func UnionFirstSemigroup[K comparable, V any]() S.Semigroup[map[K]V] {
|
||||
return G.UnionFirstSemigroup[map[K]V]()
|
||||
}
|
||||
|
@@ -59,3 +59,8 @@ func First[A any]() Semigroup[A] {
|
||||
func Last[A any]() Semigroup[A] {
|
||||
return MakeSemigroup(F.Second[A, A])
|
||||
}
|
||||
|
||||
// ToMagma converts a semigroup to a magma
|
||||
func ToMagma[A any](s Semigroup[A]) M.Magma[A] {
|
||||
return s
|
||||
}
|
||||
|
568
tuple/gen.go
568
tuple/gen.go
@@ -15,13 +15,12 @@
|
||||
|
||||
// Code generated by go generate; DO NOT EDIT.
|
||||
// This file was generated by robots at
|
||||
// 2023-07-28 15:43:31.1018593 +0200 CEST m=+0.128090501
|
||||
// 2023-07-28 22:49:18.7141124 +0200 CEST m=+0.109464201
|
||||
package tuple
|
||||
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
M "github.com/IBM/fp-go/monoid"
|
||||
O "github.com/IBM/fp-go/ord"
|
||||
)
|
||||
@@ -144,7 +143,7 @@ func Untupled1[F ~func(Tuple1[T1]) R, T1, R any](f F) func(T1) R {
|
||||
|
||||
// Monoid1 creates a [Monoid] for a [Tuple1] based on 1 monoids for the contained types
|
||||
func Monoid1[T1 any](m1 M.Monoid[T1]) M.Monoid[Tuple1[T1]] {
|
||||
return M.MakeMonoid(func(l, r Tuple1[T1]) Tuple1[T1]{
|
||||
return M.MakeMonoid(func(l, r Tuple1[T1]) Tuple1[T1] {
|
||||
return MakeTuple1(m1.Concat(l.F1, r.F1))
|
||||
}, MakeTuple1(m1.Empty()))
|
||||
}
|
||||
@@ -152,7 +151,9 @@ func Monoid1[T1 any](m1 M.Monoid[T1]) M.Monoid[Tuple1[T1]] {
|
||||
// Ord1 creates n [Ord] for a [Tuple1] based on 1 [Ord]s for the contained types
|
||||
func Ord1[T1 any](o1 O.Ord[T1]) O.Ord[Tuple1[T1]] {
|
||||
return O.MakeOrd(func(l, r Tuple1[T1]) int {
|
||||
if c:= o1.Compare(l.F1, r.F1); c != 0 {return c}
|
||||
if c := o1.Compare(l.F1, r.F1); c != 0 {
|
||||
return c
|
||||
}
|
||||
return 0
|
||||
}, func(l, r Tuple1[T1]) bool {
|
||||
return o1.Equals(l.F1, r.F1)
|
||||
@@ -186,10 +187,14 @@ func (t Tuple1[T1]) MarshalJSON() ([]byte, error) {
|
||||
// UnmarshalJSON unmarshals a JSON array into a [Tuple1]
|
||||
func (t *Tuple1[T1]) UnmarshalJSON(data []byte) error {
|
||||
var tmp []json.RawMessage
|
||||
if err := json.Unmarshal(data, &tmp); err != nil {return err}
|
||||
if err := json.Unmarshal(data, &tmp); err != nil {
|
||||
return err
|
||||
}
|
||||
l := len(tmp)
|
||||
if l > 0 {
|
||||
if err := json.Unmarshal(tmp[0], &t.F1); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[0], &t.F1); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -237,7 +242,7 @@ func Untupled2[F ~func(Tuple2[T1, T2]) R, T1, T2, R any](f F) func(T1, T2) R {
|
||||
|
||||
// Monoid2 creates a [Monoid] for a [Tuple2] based on 2 monoids for the contained types
|
||||
func Monoid2[T1, T2 any](m1 M.Monoid[T1], m2 M.Monoid[T2]) M.Monoid[Tuple2[T1, T2]] {
|
||||
return M.MakeMonoid(func(l, r Tuple2[T1, T2]) Tuple2[T1, T2]{
|
||||
return M.MakeMonoid(func(l, r Tuple2[T1, T2]) Tuple2[T1, T2] {
|
||||
return MakeTuple2(m1.Concat(l.F1, r.F1), m2.Concat(l.F2, r.F2))
|
||||
}, MakeTuple2(m1.Empty(), m2.Empty()))
|
||||
}
|
||||
@@ -245,8 +250,12 @@ func Monoid2[T1, T2 any](m1 M.Monoid[T1], m2 M.Monoid[T2]) M.Monoid[Tuple2[T1, T
|
||||
// Ord2 creates n [Ord] for a [Tuple2] based on 2 [Ord]s for the contained types
|
||||
func Ord2[T1, T2 any](o1 O.Ord[T1], o2 O.Ord[T2]) O.Ord[Tuple2[T1, T2]] {
|
||||
return O.MakeOrd(func(l, r Tuple2[T1, T2]) int {
|
||||
if c:= o1.Compare(l.F1, r.F1); c != 0 {return c}
|
||||
if c:= o2.Compare(l.F2, r.F2); c != 0 {return c}
|
||||
if c := o1.Compare(l.F1, r.F1); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o2.Compare(l.F2, r.F2); c != 0 {
|
||||
return c
|
||||
}
|
||||
return 0
|
||||
}, func(l, r Tuple2[T1, T2]) bool {
|
||||
return o1.Equals(l.F1, r.F1) && o2.Equals(l.F2, r.F2)
|
||||
@@ -281,13 +290,20 @@ func (t Tuple2[T1, T2]) MarshalJSON() ([]byte, error) {
|
||||
// UnmarshalJSON unmarshals a JSON array into a [Tuple2]
|
||||
func (t *Tuple2[T1, T2]) UnmarshalJSON(data []byte) error {
|
||||
var tmp []json.RawMessage
|
||||
if err := json.Unmarshal(data, &tmp); err != nil {return err}
|
||||
if err := json.Unmarshal(data, &tmp); err != nil {
|
||||
return err
|
||||
}
|
||||
l := len(tmp)
|
||||
if l > 0 {
|
||||
if err := json.Unmarshal(tmp[0], &t.F1); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[0], &t.F1); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 1 {
|
||||
if err := json.Unmarshal(tmp[1], &t.F2); err != nil {return err}
|
||||
}}
|
||||
if err := json.Unmarshal(tmp[1], &t.F2); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -336,7 +352,7 @@ func Untupled3[F ~func(Tuple3[T1, T2, T3]) R, T1, T2, T3, R any](f F) func(T1, T
|
||||
|
||||
// Monoid3 creates a [Monoid] for a [Tuple3] based on 3 monoids for the contained types
|
||||
func Monoid3[T1, T2, T3 any](m1 M.Monoid[T1], m2 M.Monoid[T2], m3 M.Monoid[T3]) M.Monoid[Tuple3[T1, T2, T3]] {
|
||||
return M.MakeMonoid(func(l, r Tuple3[T1, T2, T3]) Tuple3[T1, T2, T3]{
|
||||
return M.MakeMonoid(func(l, r Tuple3[T1, T2, T3]) Tuple3[T1, T2, T3] {
|
||||
return MakeTuple3(m1.Concat(l.F1, r.F1), m2.Concat(l.F2, r.F2), m3.Concat(l.F3, r.F3))
|
||||
}, MakeTuple3(m1.Empty(), m2.Empty(), m3.Empty()))
|
||||
}
|
||||
@@ -344,9 +360,15 @@ func Monoid3[T1, T2, T3 any](m1 M.Monoid[T1], m2 M.Monoid[T2], m3 M.Monoid[T3])
|
||||
// Ord3 creates n [Ord] for a [Tuple3] based on 3 [Ord]s for the contained types
|
||||
func Ord3[T1, T2, T3 any](o1 O.Ord[T1], o2 O.Ord[T2], o3 O.Ord[T3]) O.Ord[Tuple3[T1, T2, T3]] {
|
||||
return O.MakeOrd(func(l, r Tuple3[T1, T2, T3]) int {
|
||||
if c:= o1.Compare(l.F1, r.F1); c != 0 {return c}
|
||||
if c:= o2.Compare(l.F2, r.F2); c != 0 {return c}
|
||||
if c:= o3.Compare(l.F3, r.F3); c != 0 {return c}
|
||||
if c := o1.Compare(l.F1, r.F1); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o2.Compare(l.F2, r.F2); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o3.Compare(l.F3, r.F3); c != 0 {
|
||||
return c
|
||||
}
|
||||
return 0
|
||||
}, func(l, r Tuple3[T1, T2, T3]) bool {
|
||||
return o1.Equals(l.F1, r.F1) && o2.Equals(l.F2, r.F2) && o3.Equals(l.F3, r.F3)
|
||||
@@ -382,15 +404,25 @@ func (t Tuple3[T1, T2, T3]) MarshalJSON() ([]byte, error) {
|
||||
// UnmarshalJSON unmarshals a JSON array into a [Tuple3]
|
||||
func (t *Tuple3[T1, T2, T3]) UnmarshalJSON(data []byte) error {
|
||||
var tmp []json.RawMessage
|
||||
if err := json.Unmarshal(data, &tmp); err != nil {return err}
|
||||
if err := json.Unmarshal(data, &tmp); err != nil {
|
||||
return err
|
||||
}
|
||||
l := len(tmp)
|
||||
if l > 0 {
|
||||
if err := json.Unmarshal(tmp[0], &t.F1); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[0], &t.F1); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 1 {
|
||||
if err := json.Unmarshal(tmp[1], &t.F2); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[1], &t.F2); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 2 {
|
||||
if err := json.Unmarshal(tmp[2], &t.F3); err != nil {return err}
|
||||
}}}
|
||||
if err := json.Unmarshal(tmp[2], &t.F3); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -441,7 +473,7 @@ func Untupled4[F ~func(Tuple4[T1, T2, T3, T4]) R, T1, T2, T3, T4, R any](f F) fu
|
||||
|
||||
// Monoid4 creates a [Monoid] for a [Tuple4] based on 4 monoids for the contained types
|
||||
func Monoid4[T1, T2, T3, T4 any](m1 M.Monoid[T1], m2 M.Monoid[T2], m3 M.Monoid[T3], m4 M.Monoid[T4]) M.Monoid[Tuple4[T1, T2, T3, T4]] {
|
||||
return M.MakeMonoid(func(l, r Tuple4[T1, T2, T3, T4]) Tuple4[T1, T2, T3, T4]{
|
||||
return M.MakeMonoid(func(l, r Tuple4[T1, T2, T3, T4]) Tuple4[T1, T2, T3, T4] {
|
||||
return MakeTuple4(m1.Concat(l.F1, r.F1), m2.Concat(l.F2, r.F2), m3.Concat(l.F3, r.F3), m4.Concat(l.F4, r.F4))
|
||||
}, MakeTuple4(m1.Empty(), m2.Empty(), m3.Empty(), m4.Empty()))
|
||||
}
|
||||
@@ -449,10 +481,18 @@ func Monoid4[T1, T2, T3, T4 any](m1 M.Monoid[T1], m2 M.Monoid[T2], m3 M.Monoid[T
|
||||
// Ord4 creates n [Ord] for a [Tuple4] based on 4 [Ord]s for the contained types
|
||||
func Ord4[T1, T2, T3, T4 any](o1 O.Ord[T1], o2 O.Ord[T2], o3 O.Ord[T3], o4 O.Ord[T4]) O.Ord[Tuple4[T1, T2, T3, T4]] {
|
||||
return O.MakeOrd(func(l, r Tuple4[T1, T2, T3, T4]) int {
|
||||
if c:= o1.Compare(l.F1, r.F1); c != 0 {return c}
|
||||
if c:= o2.Compare(l.F2, r.F2); c != 0 {return c}
|
||||
if c:= o3.Compare(l.F3, r.F3); c != 0 {return c}
|
||||
if c:= o4.Compare(l.F4, r.F4); c != 0 {return c}
|
||||
if c := o1.Compare(l.F1, r.F1); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o2.Compare(l.F2, r.F2); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o3.Compare(l.F3, r.F3); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o4.Compare(l.F4, r.F4); c != 0 {
|
||||
return c
|
||||
}
|
||||
return 0
|
||||
}, func(l, r Tuple4[T1, T2, T3, T4]) bool {
|
||||
return o1.Equals(l.F1, r.F1) && o2.Equals(l.F2, r.F2) && o3.Equals(l.F3, r.F3) && o4.Equals(l.F4, r.F4)
|
||||
@@ -489,17 +529,30 @@ func (t Tuple4[T1, T2, T3, T4]) MarshalJSON() ([]byte, error) {
|
||||
// UnmarshalJSON unmarshals a JSON array into a [Tuple4]
|
||||
func (t *Tuple4[T1, T2, T3, T4]) UnmarshalJSON(data []byte) error {
|
||||
var tmp []json.RawMessage
|
||||
if err := json.Unmarshal(data, &tmp); err != nil {return err}
|
||||
if err := json.Unmarshal(data, &tmp); err != nil {
|
||||
return err
|
||||
}
|
||||
l := len(tmp)
|
||||
if l > 0 {
|
||||
if err := json.Unmarshal(tmp[0], &t.F1); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[0], &t.F1); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 1 {
|
||||
if err := json.Unmarshal(tmp[1], &t.F2); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[1], &t.F2); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 2 {
|
||||
if err := json.Unmarshal(tmp[2], &t.F3); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[2], &t.F3); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 3 {
|
||||
if err := json.Unmarshal(tmp[3], &t.F4); err != nil {return err}
|
||||
}}}}
|
||||
if err := json.Unmarshal(tmp[3], &t.F4); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -552,7 +605,7 @@ func Untupled5[F ~func(Tuple5[T1, T2, T3, T4, T5]) R, T1, T2, T3, T4, T5, R any]
|
||||
|
||||
// Monoid5 creates a [Monoid] for a [Tuple5] based on 5 monoids for the contained types
|
||||
func Monoid5[T1, T2, T3, T4, T5 any](m1 M.Monoid[T1], m2 M.Monoid[T2], m3 M.Monoid[T3], m4 M.Monoid[T4], m5 M.Monoid[T5]) M.Monoid[Tuple5[T1, T2, T3, T4, T5]] {
|
||||
return M.MakeMonoid(func(l, r Tuple5[T1, T2, T3, T4, T5]) Tuple5[T1, T2, T3, T4, T5]{
|
||||
return M.MakeMonoid(func(l, r Tuple5[T1, T2, T3, T4, T5]) Tuple5[T1, T2, T3, T4, T5] {
|
||||
return MakeTuple5(m1.Concat(l.F1, r.F1), m2.Concat(l.F2, r.F2), m3.Concat(l.F3, r.F3), m4.Concat(l.F4, r.F4), m5.Concat(l.F5, r.F5))
|
||||
}, MakeTuple5(m1.Empty(), m2.Empty(), m3.Empty(), m4.Empty(), m5.Empty()))
|
||||
}
|
||||
@@ -560,11 +613,21 @@ func Monoid5[T1, T2, T3, T4, T5 any](m1 M.Monoid[T1], m2 M.Monoid[T2], m3 M.Mono
|
||||
// Ord5 creates n [Ord] for a [Tuple5] based on 5 [Ord]s for the contained types
|
||||
func Ord5[T1, T2, T3, T4, T5 any](o1 O.Ord[T1], o2 O.Ord[T2], o3 O.Ord[T3], o4 O.Ord[T4], o5 O.Ord[T5]) O.Ord[Tuple5[T1, T2, T3, T4, T5]] {
|
||||
return O.MakeOrd(func(l, r Tuple5[T1, T2, T3, T4, T5]) int {
|
||||
if c:= o1.Compare(l.F1, r.F1); c != 0 {return c}
|
||||
if c:= o2.Compare(l.F2, r.F2); c != 0 {return c}
|
||||
if c:= o3.Compare(l.F3, r.F3); c != 0 {return c}
|
||||
if c:= o4.Compare(l.F4, r.F4); c != 0 {return c}
|
||||
if c:= o5.Compare(l.F5, r.F5); c != 0 {return c}
|
||||
if c := o1.Compare(l.F1, r.F1); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o2.Compare(l.F2, r.F2); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o3.Compare(l.F3, r.F3); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o4.Compare(l.F4, r.F4); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o5.Compare(l.F5, r.F5); c != 0 {
|
||||
return c
|
||||
}
|
||||
return 0
|
||||
}, func(l, r Tuple5[T1, T2, T3, T4, T5]) bool {
|
||||
return o1.Equals(l.F1, r.F1) && o2.Equals(l.F2, r.F2) && o3.Equals(l.F3, r.F3) && o4.Equals(l.F4, r.F4) && o5.Equals(l.F5, r.F5)
|
||||
@@ -602,19 +665,35 @@ func (t Tuple5[T1, T2, T3, T4, T5]) MarshalJSON() ([]byte, error) {
|
||||
// UnmarshalJSON unmarshals a JSON array into a [Tuple5]
|
||||
func (t *Tuple5[T1, T2, T3, T4, T5]) UnmarshalJSON(data []byte) error {
|
||||
var tmp []json.RawMessage
|
||||
if err := json.Unmarshal(data, &tmp); err != nil {return err}
|
||||
if err := json.Unmarshal(data, &tmp); err != nil {
|
||||
return err
|
||||
}
|
||||
l := len(tmp)
|
||||
if l > 0 {
|
||||
if err := json.Unmarshal(tmp[0], &t.F1); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[0], &t.F1); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 1 {
|
||||
if err := json.Unmarshal(tmp[1], &t.F2); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[1], &t.F2); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 2 {
|
||||
if err := json.Unmarshal(tmp[2], &t.F3); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[2], &t.F3); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 3 {
|
||||
if err := json.Unmarshal(tmp[3], &t.F4); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[3], &t.F4); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 4 {
|
||||
if err := json.Unmarshal(tmp[4], &t.F5); err != nil {return err}
|
||||
}}}}}
|
||||
if err := json.Unmarshal(tmp[4], &t.F5); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -669,7 +748,7 @@ func Untupled6[F ~func(Tuple6[T1, T2, T3, T4, T5, T6]) R, T1, T2, T3, T4, T5, T6
|
||||
|
||||
// Monoid6 creates a [Monoid] for a [Tuple6] based on 6 monoids for the contained types
|
||||
func Monoid6[T1, T2, T3, T4, T5, T6 any](m1 M.Monoid[T1], m2 M.Monoid[T2], m3 M.Monoid[T3], m4 M.Monoid[T4], m5 M.Monoid[T5], m6 M.Monoid[T6]) M.Monoid[Tuple6[T1, T2, T3, T4, T5, T6]] {
|
||||
return M.MakeMonoid(func(l, r Tuple6[T1, T2, T3, T4, T5, T6]) Tuple6[T1, T2, T3, T4, T5, T6]{
|
||||
return M.MakeMonoid(func(l, r Tuple6[T1, T2, T3, T4, T5, T6]) Tuple6[T1, T2, T3, T4, T5, T6] {
|
||||
return MakeTuple6(m1.Concat(l.F1, r.F1), m2.Concat(l.F2, r.F2), m3.Concat(l.F3, r.F3), m4.Concat(l.F4, r.F4), m5.Concat(l.F5, r.F5), m6.Concat(l.F6, r.F6))
|
||||
}, MakeTuple6(m1.Empty(), m2.Empty(), m3.Empty(), m4.Empty(), m5.Empty(), m6.Empty()))
|
||||
}
|
||||
@@ -677,12 +756,24 @@ func Monoid6[T1, T2, T3, T4, T5, T6 any](m1 M.Monoid[T1], m2 M.Monoid[T2], m3 M.
|
||||
// Ord6 creates n [Ord] for a [Tuple6] based on 6 [Ord]s for the contained types
|
||||
func Ord6[T1, T2, T3, T4, T5, T6 any](o1 O.Ord[T1], o2 O.Ord[T2], o3 O.Ord[T3], o4 O.Ord[T4], o5 O.Ord[T5], o6 O.Ord[T6]) O.Ord[Tuple6[T1, T2, T3, T4, T5, T6]] {
|
||||
return O.MakeOrd(func(l, r Tuple6[T1, T2, T3, T4, T5, T6]) int {
|
||||
if c:= o1.Compare(l.F1, r.F1); c != 0 {return c}
|
||||
if c:= o2.Compare(l.F2, r.F2); c != 0 {return c}
|
||||
if c:= o3.Compare(l.F3, r.F3); c != 0 {return c}
|
||||
if c:= o4.Compare(l.F4, r.F4); c != 0 {return c}
|
||||
if c:= o5.Compare(l.F5, r.F5); c != 0 {return c}
|
||||
if c:= o6.Compare(l.F6, r.F6); c != 0 {return c}
|
||||
if c := o1.Compare(l.F1, r.F1); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o2.Compare(l.F2, r.F2); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o3.Compare(l.F3, r.F3); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o4.Compare(l.F4, r.F4); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o5.Compare(l.F5, r.F5); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o6.Compare(l.F6, r.F6); c != 0 {
|
||||
return c
|
||||
}
|
||||
return 0
|
||||
}, func(l, r Tuple6[T1, T2, T3, T4, T5, T6]) bool {
|
||||
return o1.Equals(l.F1, r.F1) && o2.Equals(l.F2, r.F2) && o3.Equals(l.F3, r.F3) && o4.Equals(l.F4, r.F4) && o5.Equals(l.F5, r.F5) && o6.Equals(l.F6, r.F6)
|
||||
@@ -721,21 +812,40 @@ func (t Tuple6[T1, T2, T3, T4, T5, T6]) MarshalJSON() ([]byte, error) {
|
||||
// UnmarshalJSON unmarshals a JSON array into a [Tuple6]
|
||||
func (t *Tuple6[T1, T2, T3, T4, T5, T6]) UnmarshalJSON(data []byte) error {
|
||||
var tmp []json.RawMessage
|
||||
if err := json.Unmarshal(data, &tmp); err != nil {return err}
|
||||
if err := json.Unmarshal(data, &tmp); err != nil {
|
||||
return err
|
||||
}
|
||||
l := len(tmp)
|
||||
if l > 0 {
|
||||
if err := json.Unmarshal(tmp[0], &t.F1); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[0], &t.F1); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 1 {
|
||||
if err := json.Unmarshal(tmp[1], &t.F2); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[1], &t.F2); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 2 {
|
||||
if err := json.Unmarshal(tmp[2], &t.F3); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[2], &t.F3); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 3 {
|
||||
if err := json.Unmarshal(tmp[3], &t.F4); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[3], &t.F4); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 4 {
|
||||
if err := json.Unmarshal(tmp[4], &t.F5); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[4], &t.F5); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 5 {
|
||||
if err := json.Unmarshal(tmp[5], &t.F6); err != nil {return err}
|
||||
}}}}}}
|
||||
if err := json.Unmarshal(tmp[5], &t.F6); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -792,7 +902,7 @@ func Untupled7[F ~func(Tuple7[T1, T2, T3, T4, T5, T6, T7]) R, T1, T2, T3, T4, T5
|
||||
|
||||
// Monoid7 creates a [Monoid] for a [Tuple7] based on 7 monoids for the contained types
|
||||
func Monoid7[T1, T2, T3, T4, T5, T6, T7 any](m1 M.Monoid[T1], m2 M.Monoid[T2], m3 M.Monoid[T3], m4 M.Monoid[T4], m5 M.Monoid[T5], m6 M.Monoid[T6], m7 M.Monoid[T7]) M.Monoid[Tuple7[T1, T2, T3, T4, T5, T6, T7]] {
|
||||
return M.MakeMonoid(func(l, r Tuple7[T1, T2, T3, T4, T5, T6, T7]) Tuple7[T1, T2, T3, T4, T5, T6, T7]{
|
||||
return M.MakeMonoid(func(l, r Tuple7[T1, T2, T3, T4, T5, T6, T7]) Tuple7[T1, T2, T3, T4, T5, T6, T7] {
|
||||
return MakeTuple7(m1.Concat(l.F1, r.F1), m2.Concat(l.F2, r.F2), m3.Concat(l.F3, r.F3), m4.Concat(l.F4, r.F4), m5.Concat(l.F5, r.F5), m6.Concat(l.F6, r.F6), m7.Concat(l.F7, r.F7))
|
||||
}, MakeTuple7(m1.Empty(), m2.Empty(), m3.Empty(), m4.Empty(), m5.Empty(), m6.Empty(), m7.Empty()))
|
||||
}
|
||||
@@ -800,13 +910,27 @@ func Monoid7[T1, T2, T3, T4, T5, T6, T7 any](m1 M.Monoid[T1], m2 M.Monoid[T2], m
|
||||
// Ord7 creates n [Ord] for a [Tuple7] based on 7 [Ord]s for the contained types
|
||||
func Ord7[T1, T2, T3, T4, T5, T6, T7 any](o1 O.Ord[T1], o2 O.Ord[T2], o3 O.Ord[T3], o4 O.Ord[T4], o5 O.Ord[T5], o6 O.Ord[T6], o7 O.Ord[T7]) O.Ord[Tuple7[T1, T2, T3, T4, T5, T6, T7]] {
|
||||
return O.MakeOrd(func(l, r Tuple7[T1, T2, T3, T4, T5, T6, T7]) int {
|
||||
if c:= o1.Compare(l.F1, r.F1); c != 0 {return c}
|
||||
if c:= o2.Compare(l.F2, r.F2); c != 0 {return c}
|
||||
if c:= o3.Compare(l.F3, r.F3); c != 0 {return c}
|
||||
if c:= o4.Compare(l.F4, r.F4); c != 0 {return c}
|
||||
if c:= o5.Compare(l.F5, r.F5); c != 0 {return c}
|
||||
if c:= o6.Compare(l.F6, r.F6); c != 0 {return c}
|
||||
if c:= o7.Compare(l.F7, r.F7); c != 0 {return c}
|
||||
if c := o1.Compare(l.F1, r.F1); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o2.Compare(l.F2, r.F2); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o3.Compare(l.F3, r.F3); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o4.Compare(l.F4, r.F4); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o5.Compare(l.F5, r.F5); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o6.Compare(l.F6, r.F6); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o7.Compare(l.F7, r.F7); c != 0 {
|
||||
return c
|
||||
}
|
||||
return 0
|
||||
}, func(l, r Tuple7[T1, T2, T3, T4, T5, T6, T7]) bool {
|
||||
return o1.Equals(l.F1, r.F1) && o2.Equals(l.F2, r.F2) && o3.Equals(l.F3, r.F3) && o4.Equals(l.F4, r.F4) && o5.Equals(l.F5, r.F5) && o6.Equals(l.F6, r.F6) && o7.Equals(l.F7, r.F7)
|
||||
@@ -846,23 +970,45 @@ func (t Tuple7[T1, T2, T3, T4, T5, T6, T7]) MarshalJSON() ([]byte, error) {
|
||||
// UnmarshalJSON unmarshals a JSON array into a [Tuple7]
|
||||
func (t *Tuple7[T1, T2, T3, T4, T5, T6, T7]) UnmarshalJSON(data []byte) error {
|
||||
var tmp []json.RawMessage
|
||||
if err := json.Unmarshal(data, &tmp); err != nil {return err}
|
||||
if err := json.Unmarshal(data, &tmp); err != nil {
|
||||
return err
|
||||
}
|
||||
l := len(tmp)
|
||||
if l > 0 {
|
||||
if err := json.Unmarshal(tmp[0], &t.F1); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[0], &t.F1); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 1 {
|
||||
if err := json.Unmarshal(tmp[1], &t.F2); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[1], &t.F2); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 2 {
|
||||
if err := json.Unmarshal(tmp[2], &t.F3); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[2], &t.F3); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 3 {
|
||||
if err := json.Unmarshal(tmp[3], &t.F4); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[3], &t.F4); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 4 {
|
||||
if err := json.Unmarshal(tmp[4], &t.F5); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[4], &t.F5); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 5 {
|
||||
if err := json.Unmarshal(tmp[5], &t.F6); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[5], &t.F6); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 6 {
|
||||
if err := json.Unmarshal(tmp[6], &t.F7); err != nil {return err}
|
||||
}}}}}}}
|
||||
if err := json.Unmarshal(tmp[6], &t.F7); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -921,7 +1067,7 @@ func Untupled8[F ~func(Tuple8[T1, T2, T3, T4, T5, T6, T7, T8]) R, T1, T2, T3, T4
|
||||
|
||||
// Monoid8 creates a [Monoid] for a [Tuple8] based on 8 monoids for the contained types
|
||||
func Monoid8[T1, T2, T3, T4, T5, T6, T7, T8 any](m1 M.Monoid[T1], m2 M.Monoid[T2], m3 M.Monoid[T3], m4 M.Monoid[T4], m5 M.Monoid[T5], m6 M.Monoid[T6], m7 M.Monoid[T7], m8 M.Monoid[T8]) M.Monoid[Tuple8[T1, T2, T3, T4, T5, T6, T7, T8]] {
|
||||
return M.MakeMonoid(func(l, r Tuple8[T1, T2, T3, T4, T5, T6, T7, T8]) Tuple8[T1, T2, T3, T4, T5, T6, T7, T8]{
|
||||
return M.MakeMonoid(func(l, r Tuple8[T1, T2, T3, T4, T5, T6, T7, T8]) Tuple8[T1, T2, T3, T4, T5, T6, T7, T8] {
|
||||
return MakeTuple8(m1.Concat(l.F1, r.F1), m2.Concat(l.F2, r.F2), m3.Concat(l.F3, r.F3), m4.Concat(l.F4, r.F4), m5.Concat(l.F5, r.F5), m6.Concat(l.F6, r.F6), m7.Concat(l.F7, r.F7), m8.Concat(l.F8, r.F8))
|
||||
}, MakeTuple8(m1.Empty(), m2.Empty(), m3.Empty(), m4.Empty(), m5.Empty(), m6.Empty(), m7.Empty(), m8.Empty()))
|
||||
}
|
||||
@@ -929,14 +1075,30 @@ func Monoid8[T1, T2, T3, T4, T5, T6, T7, T8 any](m1 M.Monoid[T1], m2 M.Monoid[T2
|
||||
// Ord8 creates n [Ord] for a [Tuple8] based on 8 [Ord]s for the contained types
|
||||
func Ord8[T1, T2, T3, T4, T5, T6, T7, T8 any](o1 O.Ord[T1], o2 O.Ord[T2], o3 O.Ord[T3], o4 O.Ord[T4], o5 O.Ord[T5], o6 O.Ord[T6], o7 O.Ord[T7], o8 O.Ord[T8]) O.Ord[Tuple8[T1, T2, T3, T4, T5, T6, T7, T8]] {
|
||||
return O.MakeOrd(func(l, r Tuple8[T1, T2, T3, T4, T5, T6, T7, T8]) int {
|
||||
if c:= o1.Compare(l.F1, r.F1); c != 0 {return c}
|
||||
if c:= o2.Compare(l.F2, r.F2); c != 0 {return c}
|
||||
if c:= o3.Compare(l.F3, r.F3); c != 0 {return c}
|
||||
if c:= o4.Compare(l.F4, r.F4); c != 0 {return c}
|
||||
if c:= o5.Compare(l.F5, r.F5); c != 0 {return c}
|
||||
if c:= o6.Compare(l.F6, r.F6); c != 0 {return c}
|
||||
if c:= o7.Compare(l.F7, r.F7); c != 0 {return c}
|
||||
if c:= o8.Compare(l.F8, r.F8); c != 0 {return c}
|
||||
if c := o1.Compare(l.F1, r.F1); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o2.Compare(l.F2, r.F2); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o3.Compare(l.F3, r.F3); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o4.Compare(l.F4, r.F4); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o5.Compare(l.F5, r.F5); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o6.Compare(l.F6, r.F6); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o7.Compare(l.F7, r.F7); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o8.Compare(l.F8, r.F8); c != 0 {
|
||||
return c
|
||||
}
|
||||
return 0
|
||||
}, func(l, r Tuple8[T1, T2, T3, T4, T5, T6, T7, T8]) bool {
|
||||
return o1.Equals(l.F1, r.F1) && o2.Equals(l.F2, r.F2) && o3.Equals(l.F3, r.F3) && o4.Equals(l.F4, r.F4) && o5.Equals(l.F5, r.F5) && o6.Equals(l.F6, r.F6) && o7.Equals(l.F7, r.F7) && o8.Equals(l.F8, r.F8)
|
||||
@@ -977,25 +1139,50 @@ func (t Tuple8[T1, T2, T3, T4, T5, T6, T7, T8]) MarshalJSON() ([]byte, error) {
|
||||
// UnmarshalJSON unmarshals a JSON array into a [Tuple8]
|
||||
func (t *Tuple8[T1, T2, T3, T4, T5, T6, T7, T8]) UnmarshalJSON(data []byte) error {
|
||||
var tmp []json.RawMessage
|
||||
if err := json.Unmarshal(data, &tmp); err != nil {return err}
|
||||
if err := json.Unmarshal(data, &tmp); err != nil {
|
||||
return err
|
||||
}
|
||||
l := len(tmp)
|
||||
if l > 0 {
|
||||
if err := json.Unmarshal(tmp[0], &t.F1); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[0], &t.F1); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 1 {
|
||||
if err := json.Unmarshal(tmp[1], &t.F2); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[1], &t.F2); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 2 {
|
||||
if err := json.Unmarshal(tmp[2], &t.F3); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[2], &t.F3); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 3 {
|
||||
if err := json.Unmarshal(tmp[3], &t.F4); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[3], &t.F4); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 4 {
|
||||
if err := json.Unmarshal(tmp[4], &t.F5); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[4], &t.F5); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 5 {
|
||||
if err := json.Unmarshal(tmp[5], &t.F6); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[5], &t.F6); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 6 {
|
||||
if err := json.Unmarshal(tmp[6], &t.F7); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[6], &t.F7); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 7 {
|
||||
if err := json.Unmarshal(tmp[7], &t.F8); err != nil {return err}
|
||||
}}}}}}}}
|
||||
if err := json.Unmarshal(tmp[7], &t.F8); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -1056,7 +1243,7 @@ func Untupled9[F ~func(Tuple9[T1, T2, T3, T4, T5, T6, T7, T8, T9]) R, T1, T2, T3
|
||||
|
||||
// Monoid9 creates a [Monoid] for a [Tuple9] based on 9 monoids for the contained types
|
||||
func Monoid9[T1, T2, T3, T4, T5, T6, T7, T8, T9 any](m1 M.Monoid[T1], m2 M.Monoid[T2], m3 M.Monoid[T3], m4 M.Monoid[T4], m5 M.Monoid[T5], m6 M.Monoid[T6], m7 M.Monoid[T7], m8 M.Monoid[T8], m9 M.Monoid[T9]) M.Monoid[Tuple9[T1, T2, T3, T4, T5, T6, T7, T8, T9]] {
|
||||
return M.MakeMonoid(func(l, r Tuple9[T1, T2, T3, T4, T5, T6, T7, T8, T9]) Tuple9[T1, T2, T3, T4, T5, T6, T7, T8, T9]{
|
||||
return M.MakeMonoid(func(l, r Tuple9[T1, T2, T3, T4, T5, T6, T7, T8, T9]) Tuple9[T1, T2, T3, T4, T5, T6, T7, T8, T9] {
|
||||
return MakeTuple9(m1.Concat(l.F1, r.F1), m2.Concat(l.F2, r.F2), m3.Concat(l.F3, r.F3), m4.Concat(l.F4, r.F4), m5.Concat(l.F5, r.F5), m6.Concat(l.F6, r.F6), m7.Concat(l.F7, r.F7), m8.Concat(l.F8, r.F8), m9.Concat(l.F9, r.F9))
|
||||
}, MakeTuple9(m1.Empty(), m2.Empty(), m3.Empty(), m4.Empty(), m5.Empty(), m6.Empty(), m7.Empty(), m8.Empty(), m9.Empty()))
|
||||
}
|
||||
@@ -1064,15 +1251,33 @@ func Monoid9[T1, T2, T3, T4, T5, T6, T7, T8, T9 any](m1 M.Monoid[T1], m2 M.Monoi
|
||||
// Ord9 creates n [Ord] for a [Tuple9] based on 9 [Ord]s for the contained types
|
||||
func Ord9[T1, T2, T3, T4, T5, T6, T7, T8, T9 any](o1 O.Ord[T1], o2 O.Ord[T2], o3 O.Ord[T3], o4 O.Ord[T4], o5 O.Ord[T5], o6 O.Ord[T6], o7 O.Ord[T7], o8 O.Ord[T8], o9 O.Ord[T9]) O.Ord[Tuple9[T1, T2, T3, T4, T5, T6, T7, T8, T9]] {
|
||||
return O.MakeOrd(func(l, r Tuple9[T1, T2, T3, T4, T5, T6, T7, T8, T9]) int {
|
||||
if c:= o1.Compare(l.F1, r.F1); c != 0 {return c}
|
||||
if c:= o2.Compare(l.F2, r.F2); c != 0 {return c}
|
||||
if c:= o3.Compare(l.F3, r.F3); c != 0 {return c}
|
||||
if c:= o4.Compare(l.F4, r.F4); c != 0 {return c}
|
||||
if c:= o5.Compare(l.F5, r.F5); c != 0 {return c}
|
||||
if c:= o6.Compare(l.F6, r.F6); c != 0 {return c}
|
||||
if c:= o7.Compare(l.F7, r.F7); c != 0 {return c}
|
||||
if c:= o8.Compare(l.F8, r.F8); c != 0 {return c}
|
||||
if c:= o9.Compare(l.F9, r.F9); c != 0 {return c}
|
||||
if c := o1.Compare(l.F1, r.F1); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o2.Compare(l.F2, r.F2); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o3.Compare(l.F3, r.F3); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o4.Compare(l.F4, r.F4); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o5.Compare(l.F5, r.F5); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o6.Compare(l.F6, r.F6); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o7.Compare(l.F7, r.F7); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o8.Compare(l.F8, r.F8); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o9.Compare(l.F9, r.F9); c != 0 {
|
||||
return c
|
||||
}
|
||||
return 0
|
||||
}, func(l, r Tuple9[T1, T2, T3, T4, T5, T6, T7, T8, T9]) bool {
|
||||
return o1.Equals(l.F1, r.F1) && o2.Equals(l.F2, r.F2) && o3.Equals(l.F3, r.F3) && o4.Equals(l.F4, r.F4) && o5.Equals(l.F5, r.F5) && o6.Equals(l.F6, r.F6) && o7.Equals(l.F7, r.F7) && o8.Equals(l.F8, r.F8) && o9.Equals(l.F9, r.F9)
|
||||
@@ -1114,27 +1319,55 @@ func (t Tuple9[T1, T2, T3, T4, T5, T6, T7, T8, T9]) MarshalJSON() ([]byte, error
|
||||
// UnmarshalJSON unmarshals a JSON array into a [Tuple9]
|
||||
func (t *Tuple9[T1, T2, T3, T4, T5, T6, T7, T8, T9]) UnmarshalJSON(data []byte) error {
|
||||
var tmp []json.RawMessage
|
||||
if err := json.Unmarshal(data, &tmp); err != nil {return err}
|
||||
if err := json.Unmarshal(data, &tmp); err != nil {
|
||||
return err
|
||||
}
|
||||
l := len(tmp)
|
||||
if l > 0 {
|
||||
if err := json.Unmarshal(tmp[0], &t.F1); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[0], &t.F1); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 1 {
|
||||
if err := json.Unmarshal(tmp[1], &t.F2); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[1], &t.F2); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 2 {
|
||||
if err := json.Unmarshal(tmp[2], &t.F3); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[2], &t.F3); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 3 {
|
||||
if err := json.Unmarshal(tmp[3], &t.F4); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[3], &t.F4); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 4 {
|
||||
if err := json.Unmarshal(tmp[4], &t.F5); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[4], &t.F5); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 5 {
|
||||
if err := json.Unmarshal(tmp[5], &t.F6); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[5], &t.F6); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 6 {
|
||||
if err := json.Unmarshal(tmp[6], &t.F7); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[6], &t.F7); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 7 {
|
||||
if err := json.Unmarshal(tmp[7], &t.F8); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[7], &t.F8); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 8 {
|
||||
if err := json.Unmarshal(tmp[8], &t.F9); err != nil {return err}
|
||||
}}}}}}}}}
|
||||
if err := json.Unmarshal(tmp[8], &t.F9); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -1197,7 +1430,7 @@ func Untupled10[F ~func(Tuple10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]) R, T1,
|
||||
|
||||
// Monoid10 creates a [Monoid] for a [Tuple10] based on 10 monoids for the contained types
|
||||
func Monoid10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10 any](m1 M.Monoid[T1], m2 M.Monoid[T2], m3 M.Monoid[T3], m4 M.Monoid[T4], m5 M.Monoid[T5], m6 M.Monoid[T6], m7 M.Monoid[T7], m8 M.Monoid[T8], m9 M.Monoid[T9], m10 M.Monoid[T10]) M.Monoid[Tuple10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]] {
|
||||
return M.MakeMonoid(func(l, r Tuple10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]) Tuple10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]{
|
||||
return M.MakeMonoid(func(l, r Tuple10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]) Tuple10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10] {
|
||||
return MakeTuple10(m1.Concat(l.F1, r.F1), m2.Concat(l.F2, r.F2), m3.Concat(l.F3, r.F3), m4.Concat(l.F4, r.F4), m5.Concat(l.F5, r.F5), m6.Concat(l.F6, r.F6), m7.Concat(l.F7, r.F7), m8.Concat(l.F8, r.F8), m9.Concat(l.F9, r.F9), m10.Concat(l.F10, r.F10))
|
||||
}, MakeTuple10(m1.Empty(), m2.Empty(), m3.Empty(), m4.Empty(), m5.Empty(), m6.Empty(), m7.Empty(), m8.Empty(), m9.Empty(), m10.Empty()))
|
||||
}
|
||||
@@ -1205,16 +1438,36 @@ func Monoid10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10 any](m1 M.Monoid[T1], m2 M
|
||||
// Ord10 creates n [Ord] for a [Tuple10] based on 10 [Ord]s for the contained types
|
||||
func Ord10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10 any](o1 O.Ord[T1], o2 O.Ord[T2], o3 O.Ord[T3], o4 O.Ord[T4], o5 O.Ord[T5], o6 O.Ord[T6], o7 O.Ord[T7], o8 O.Ord[T8], o9 O.Ord[T9], o10 O.Ord[T10]) O.Ord[Tuple10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]] {
|
||||
return O.MakeOrd(func(l, r Tuple10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]) int {
|
||||
if c:= o1.Compare(l.F1, r.F1); c != 0 {return c}
|
||||
if c:= o2.Compare(l.F2, r.F2); c != 0 {return c}
|
||||
if c:= o3.Compare(l.F3, r.F3); c != 0 {return c}
|
||||
if c:= o4.Compare(l.F4, r.F4); c != 0 {return c}
|
||||
if c:= o5.Compare(l.F5, r.F5); c != 0 {return c}
|
||||
if c:= o6.Compare(l.F6, r.F6); c != 0 {return c}
|
||||
if c:= o7.Compare(l.F7, r.F7); c != 0 {return c}
|
||||
if c:= o8.Compare(l.F8, r.F8); c != 0 {return c}
|
||||
if c:= o9.Compare(l.F9, r.F9); c != 0 {return c}
|
||||
if c:= o10.Compare(l.F10, r.F10); c != 0 {return c}
|
||||
if c := o1.Compare(l.F1, r.F1); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o2.Compare(l.F2, r.F2); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o3.Compare(l.F3, r.F3); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o4.Compare(l.F4, r.F4); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o5.Compare(l.F5, r.F5); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o6.Compare(l.F6, r.F6); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o7.Compare(l.F7, r.F7); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o8.Compare(l.F8, r.F8); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o9.Compare(l.F9, r.F9); c != 0 {
|
||||
return c
|
||||
}
|
||||
if c := o10.Compare(l.F10, r.F10); c != 0 {
|
||||
return c
|
||||
}
|
||||
return 0
|
||||
}, func(l, r Tuple10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]) bool {
|
||||
return o1.Equals(l.F1, r.F1) && o2.Equals(l.F2, r.F2) && o3.Equals(l.F3, r.F3) && o4.Equals(l.F4, r.F4) && o5.Equals(l.F5, r.F5) && o6.Equals(l.F6, r.F6) && o7.Equals(l.F7, r.F7) && o8.Equals(l.F8, r.F8) && o9.Equals(l.F9, r.F9) && o10.Equals(l.F10, r.F10)
|
||||
@@ -1257,29 +1510,60 @@ func (t Tuple10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]) MarshalJSON() ([]byte,
|
||||
// UnmarshalJSON unmarshals a JSON array into a [Tuple10]
|
||||
func (t *Tuple10[T1, T2, T3, T4, T5, T6, T7, T8, T9, T10]) UnmarshalJSON(data []byte) error {
|
||||
var tmp []json.RawMessage
|
||||
if err := json.Unmarshal(data, &tmp); err != nil {return err}
|
||||
if err := json.Unmarshal(data, &tmp); err != nil {
|
||||
return err
|
||||
}
|
||||
l := len(tmp)
|
||||
if l > 0 {
|
||||
if err := json.Unmarshal(tmp[0], &t.F1); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[0], &t.F1); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 1 {
|
||||
if err := json.Unmarshal(tmp[1], &t.F2); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[1], &t.F2); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 2 {
|
||||
if err := json.Unmarshal(tmp[2], &t.F3); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[2], &t.F3); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 3 {
|
||||
if err := json.Unmarshal(tmp[3], &t.F4); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[3], &t.F4); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 4 {
|
||||
if err := json.Unmarshal(tmp[4], &t.F5); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[4], &t.F5); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 5 {
|
||||
if err := json.Unmarshal(tmp[5], &t.F6); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[5], &t.F6); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 6 {
|
||||
if err := json.Unmarshal(tmp[6], &t.F7); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[6], &t.F7); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 7 {
|
||||
if err := json.Unmarshal(tmp[7], &t.F8); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[7], &t.F8); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 8 {
|
||||
if err := json.Unmarshal(tmp[8], &t.F9); err != nil {return err}
|
||||
if err := json.Unmarshal(tmp[8], &t.F9); err != nil {
|
||||
return err
|
||||
}
|
||||
if l > 9 {
|
||||
if err := json.Unmarshal(tmp[9], &t.F10); err != nil {return err}
|
||||
}}}}}}}}}}
|
||||
if err := json.Unmarshal(tmp[9], &t.F10); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user