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:
@@ -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)
|
||||||
|
}
|
||||||
|
@@ -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)
|
||||||
|
}
|
||||||
|
@@ -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
28
internal/array/prepend.go
Normal 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
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user