diff --git a/array/array.go b/array/array.go index a4f600c..24ee561 100644 --- a/array/array.go +++ b/array/array.go @@ -17,6 +17,7 @@ package array import ( G "github.com/IBM/fp-go/array/generic" + EM "github.com/IBM/fp-go/endomorphism" F "github.com/IBM/fp-go/function" "github.com/IBM/fp-go/internal/array" 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 -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) } // 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) } -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) } @@ -227,7 +228,7 @@ func Last[A any](as []A) O.Option[A] { 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 { count := len(as) 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) return func(as []A) []A { if IsEmpty(as) { @@ -271,7 +272,7 @@ func Lookup[A any](idx int) func([]A) O.Option[A] { 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) } @@ -304,7 +305,7 @@ func ConstNil[A any]() []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) } @@ -333,8 +334,8 @@ func Fold[A any](m M.Monoid[A]) func([]A) A { return G.Fold[[]A](m) } -func Push[A any](a A) func([]A) []A { - return G.Push[[]A](a) +func Push[A any](a A) EM.Endomorphism[[]A] { + return G.Push[EM.Endomorphism[[]A]](a) } 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 { 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) +} diff --git a/array/generic/array.go b/array/generic/array.go index f5f2974..64fd8dd 100644 --- a/array/generic/array.go +++ b/array/generic/array.go @@ -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) } @@ -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 { 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) +} diff --git a/array/nonempty/array.go b/array/nonempty/array.go index 8f56c0e..e452d9c 100644 --- a/array/nonempty/array.go +++ b/array/nonempty/array.go @@ -17,6 +17,7 @@ package nonempty import ( G "github.com/IBM/fp-go/array/generic" + EM "github.com/IBM/fp-go/endomorphism" F "github.com/IBM/fp-go/function" "github.com/IBM/fp-go/internal/array" 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)) } } + +// 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) +} diff --git a/internal/array/prepend.go b/internal/array/prepend.go new file mode 100644 index 0000000..437a5d7 --- /dev/null +++ b/internal/array/prepend.go @@ -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 + + } +}