1
0
mirror of https://github.com/IBM/fp-go.git synced 2025-08-10 22:31:32 +02:00

fix: add prepend method

Signed-off-by: Dr. Carsten Leue <carsten.leue@de.ibm.com>
This commit is contained in:
Dr. Carsten Leue
2023-12-21 16:46:47 +01:00
parent 12ef79184b
commit 973138c822
4 changed files with 53 additions and 10 deletions

View File

@@ -17,6 +17,7 @@ package array
import ( import (
G "github.com/IBM/fp-go/array/generic" G "github.com/IBM/fp-go/array/generic"
EM "github.com/IBM/fp-go/endomorphism"
F "github.com/IBM/fp-go/function" F "github.com/IBM/fp-go/function"
"github.com/IBM/fp-go/internal/array" "github.com/IBM/fp-go/internal/array"
M "github.com/IBM/fp-go/monoid" M "github.com/IBM/fp-go/monoid"
@@ -89,16 +90,16 @@ func filterMapRef[A, B any](fa []A, pred func(a *A) bool, f func(a *A) B) []B {
} }
// Filter returns a new array with all elements from the original array that match a predicate // Filter returns a new array with all elements from the original array that match a predicate
func Filter[A any](pred func(A) bool) func([]A) []A { func Filter[A any](pred func(A) bool) EM.Endomorphism[[]A] {
return G.Filter[[]A](pred) return G.Filter[[]A](pred)
} }
// FilterWithIndex returns a new array with all elements from the original array that match a predicate // FilterWithIndex returns a new array with all elements from the original array that match a predicate
func FilterWithIndex[A any](pred func(int, A) bool) func([]A) []A { func FilterWithIndex[A any](pred func(int, A) bool) EM.Endomorphism[[]A] {
return G.FilterWithIndex[[]A](pred) return G.FilterWithIndex[[]A](pred)
} }
func FilterRef[A any](pred func(*A) bool) func([]A) []A { func FilterRef[A any](pred func(*A) bool) EM.Endomorphism[[]A] {
return F.Bind2nd(filterRef[A], pred) return F.Bind2nd(filterRef[A], pred)
} }
@@ -227,7 +228,7 @@ func Last[A any](as []A) O.Option[A] {
return G.Last(as) return G.Last(as)
} }
func PrependAll[A any](middle A) func([]A) []A { func PrependAll[A any](middle A) EM.Endomorphism[[]A] {
return func(as []A) []A { return func(as []A) []A {
count := len(as) count := len(as)
dst := count * 2 dst := count * 2
@@ -242,7 +243,7 @@ func PrependAll[A any](middle A) func([]A) []A {
} }
} }
func Intersperse[A any](middle A) func([]A) []A { func Intersperse[A any](middle A) EM.Endomorphism[[]A] {
prepend := PrependAll(middle) prepend := PrependAll(middle)
return func(as []A) []A { return func(as []A) []A {
if IsEmpty(as) { if IsEmpty(as) {
@@ -271,7 +272,7 @@ func Lookup[A any](idx int) func([]A) O.Option[A] {
return G.Lookup[[]A](idx) return G.Lookup[[]A](idx)
} }
func UpsertAt[A any](a A) func([]A) []A { func UpsertAt[A any](a A) EM.Endomorphism[[]A] {
return G.UpsertAt[[]A](a) return G.UpsertAt[[]A](a)
} }
@@ -304,7 +305,7 @@ func ConstNil[A any]() []A {
return array.ConstNil[[]A]() return array.ConstNil[[]A]()
} }
func SliceRight[A any](start int) func([]A) []A { func SliceRight[A any](start int) EM.Endomorphism[[]A] {
return G.SliceRight[[]A](start) return G.SliceRight[[]A](start)
} }
@@ -333,8 +334,8 @@ func Fold[A any](m M.Monoid[A]) func([]A) A {
return G.Fold[[]A](m) return G.Fold[[]A](m)
} }
func Push[A any](a A) func([]A) []A { func Push[A any](a A) EM.Endomorphism[[]A] {
return G.Push[[]A](a) return G.Push[EM.Endomorphism[[]A]](a)
} }
func MonadFlap[B, A any](fab []func(A) B, a A) []B { func MonadFlap[B, A any](fab []func(A) B, a A) []B {
@@ -344,3 +345,7 @@ func MonadFlap[B, A any](fab []func(A) B, a A) []B {
func Flap[B, A any](a A) func([]func(A) B) []B { func Flap[B, A any](a A) func([]func(A) B) []B {
return G.Flap[func(A) B, []func(A) B, []B, A, B](a) return G.Flap[func(A) B, []func(A) B, []B, A, B](a)
} }
func Prepend[A any](head A) EM.Endomorphism[[]A] {
return G.Prepend[EM.Endomorphism[[]A]](head)
}

View File

@@ -335,7 +335,7 @@ func Fold[AS ~[]A, A any](m M.Monoid[A]) func(AS) A {
} }
} }
func Push[GA ~[]A, A any](a A) func(GA) GA { func Push[ENDO ~func(GA) GA, GA ~[]A, A any](a A) ENDO {
return F.Bind2nd(array.Push[GA, A], a) return F.Bind2nd(array.Push[GA, A], a)
} }
@@ -346,3 +346,7 @@ func MonadFlap[FAB ~func(A) B, GFAB ~[]FAB, GB ~[]B, A, B any](fab GFAB, a A) GB
func Flap[FAB ~func(A) B, GFAB ~[]FAB, GB ~[]B, A, B any](a A) func(GFAB) GB { func Flap[FAB ~func(A) B, GFAB ~[]FAB, GB ~[]B, A, B any](a A) func(GFAB) GB {
return F.Bind2nd(MonadFlap[FAB, GFAB, GB, A, B], a) return F.Bind2nd(MonadFlap[FAB, GFAB, GB, A, B], a)
} }
func Prepend[ENDO ~func(AS) AS, AS []A, A any](head A) ENDO {
return array.Prepend[ENDO](head)
}

View File

@@ -17,6 +17,7 @@ package nonempty
import ( import (
G "github.com/IBM/fp-go/array/generic" G "github.com/IBM/fp-go/array/generic"
EM "github.com/IBM/fp-go/endomorphism"
F "github.com/IBM/fp-go/function" F "github.com/IBM/fp-go/function"
"github.com/IBM/fp-go/internal/array" "github.com/IBM/fp-go/internal/array"
S "github.com/IBM/fp-go/semigroup" S "github.com/IBM/fp-go/semigroup"
@@ -122,3 +123,8 @@ func Fold[A any](s S.Semigroup[A]) func(NonEmptyArray[A]) A {
return array.Reduce(Tail(as), s.Concat, Head(as)) return array.Reduce(Tail(as), s.Concat, Head(as))
} }
} }
// Prepend prepends a single value to an array
func Prepend[A any](head A) EM.Endomorphism[NonEmptyArray[A]] {
return array.Prepend[EM.Endomorphism[NonEmptyArray[A]]](head)
}

28
internal/array/prepend.go Normal file
View File

@@ -0,0 +1,28 @@
// 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
// Prepend prepends a single value to an array
func Prepend[ENDO ~func(AS) AS, AS ~[]A, A any](head A) ENDO {
return func(as AS) AS {
l := len(as)
cpy := make(AS, l+1)
copy(cpy[1:], as)
cpy[0] = head
return cpy
}
}