mirror of
https://github.com/IBM/fp-go.git
synced 2025-07-17 01:32:23 +02:00
fix: attempt to expose Monad as an interface
Signed-off-by: Dr. Carsten Leue <carsten.leue@de.ibm.com>
This commit is contained in:
43
array/generic/monad.go
Normal file
43
array/generic/monad.go
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
// Copyright (c) 2024 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 (
|
||||||
|
"github.com/IBM/fp-go/internal/monad"
|
||||||
|
)
|
||||||
|
|
||||||
|
type arrayMonad[A, B any, GA ~[]A, GB ~[]B, GAB ~[]func(A) B] struct{}
|
||||||
|
|
||||||
|
func (o *arrayMonad[A, B, GA, GB, GAB]) Of(a A) GA {
|
||||||
|
return Of[GA, A](a)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *arrayMonad[A, B, GA, GB, GAB]) Map(f func(A) B) func(GA) GB {
|
||||||
|
return Map[GA, GB, A, B](f)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *arrayMonad[A, B, GA, GB, GAB]) Chain(f func(A) GB) func(GA) GB {
|
||||||
|
return Chain[GA, GB, A, B](f)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *arrayMonad[A, B, GA, GB, GAB]) Ap(fa GA) func(GAB) GB {
|
||||||
|
return Ap[GB, GAB, GA, B, A](fa)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Monad implements the monadic operations for an array
|
||||||
|
func Monad[A, B any, GA ~[]A, GB ~[]B, GAB ~[]func(A) B]() monad.Monad[A, B, GA, GB, GAB] {
|
||||||
|
return &arrayMonad[A, B, GA, GB, GAB]{}
|
||||||
|
}
|
26
array/monad.go
Normal file
26
array/monad.go
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
// Copyright (c) 2024 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"
|
||||||
|
"github.com/IBM/fp-go/internal/monad"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Monad returns the monadic operations for an array
|
||||||
|
func Monad[A, B any]() monad.Monad[A, B, []A, []B, []func(A) B] {
|
||||||
|
return G.Monad[A, B, []A, []B, []func(A) B]()
|
||||||
|
}
|
43
either/monad.go
Normal file
43
either/monad.go
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
// Copyright (c) 2024 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 (
|
||||||
|
"github.com/IBM/fp-go/internal/monad"
|
||||||
|
)
|
||||||
|
|
||||||
|
type eitherMonad[E, A, B any] struct{}
|
||||||
|
|
||||||
|
func (o *eitherMonad[E, A, B]) Of(a A) Either[E, A] {
|
||||||
|
return Of[E, A](a)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *eitherMonad[E, A, B]) Map(f func(A) B) func(Either[E, A]) Either[E, B] {
|
||||||
|
return Map[E, A, B](f)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *eitherMonad[E, A, B]) Chain(f func(A) Either[E, B]) func(Either[E, A]) Either[E, B] {
|
||||||
|
return Chain[E, A, B](f)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *eitherMonad[E, A, B]) Ap(fa Either[E, A]) func(Either[E, func(A) B]) Either[E, B] {
|
||||||
|
return Ap[B, E, A](fa)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Monad implements the monadic operations for [Either]
|
||||||
|
func Monad[E, A, B any]() monad.Monad[A, B, Either[E, A], Either[E, B], Either[E, func(A) B]] {
|
||||||
|
return &eitherMonad[E, A, B]{}
|
||||||
|
}
|
43
identity/monad.go
Normal file
43
identity/monad.go
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
// Copyright (c) 2024 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 identity
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/IBM/fp-go/internal/monad"
|
||||||
|
)
|
||||||
|
|
||||||
|
type identityMonad[A, B any] struct{}
|
||||||
|
|
||||||
|
func (o *identityMonad[A, B]) Of(a A) A {
|
||||||
|
return Of[A](a)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *identityMonad[A, B]) Map(f func(A) B) func(A) B {
|
||||||
|
return Map[A, B](f)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *identityMonad[A, B]) Chain(f func(A) B) func(A) B {
|
||||||
|
return Chain[A, B](f)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *identityMonad[A, B]) Ap(fa A) func(func(A) B) B {
|
||||||
|
return Ap[B, A](fa)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Monad implements the monadic operations for [Option]
|
||||||
|
func Monad[A, B any]() monad.Monad[A, B, A, B, func(A) B] {
|
||||||
|
return &identityMonad[A, B]{}
|
||||||
|
}
|
26
internal/applicative/types.go
Normal file
26
internal/applicative/types.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 applicative
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/IBM/fp-go/internal/apply"
|
||||||
|
"github.com/IBM/fp-go/internal/pointed"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Applicative[A, B, HKTA, HKTB, HKTFAB any] interface {
|
||||||
|
apply.Apply[A, B, HKTA, HKTB, HKTFAB]
|
||||||
|
pointed.Pointed[A, HKTA]
|
||||||
|
}
|
25
internal/apply/types.go
Normal file
25
internal/apply/types.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 apply
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/IBM/fp-go/internal/functor"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Apply[A, B, HKTA, HKTB, HKTFAB any] interface {
|
||||||
|
functor.Functor[A, B, HKTA, HKTB]
|
||||||
|
Ap(HKTA) func(HKTFAB) HKTB
|
||||||
|
}
|
25
internal/chain/types.go
Normal file
25
internal/chain/types.go
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
// Copyright (c) 2024 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 chain
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/IBM/fp-go/internal/apply"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Chainable[A, B, HKTA, HKTB, HKTFAB any] interface {
|
||||||
|
apply.Apply[A, B, HKTA, HKTB, HKTFAB]
|
||||||
|
Chain(func(A) HKTB) func(HKTA) HKTB
|
||||||
|
}
|
20
internal/functor/types.go
Normal file
20
internal/functor/types.go
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
// 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 functor
|
||||||
|
|
||||||
|
type Functor[A, B, HKTA, HKTB any] interface {
|
||||||
|
Map(func(A) B) func(HKTA) HKTB
|
||||||
|
}
|
26
internal/monad/monad.go
Normal file
26
internal/monad/monad.go
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
// Copyright (c) 2024 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 monad
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/IBM/fp-go/internal/applicative"
|
||||||
|
"github.com/IBM/fp-go/internal/chain"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Monad[A, B, HKTA, HKTB, HKTFAB any] interface {
|
||||||
|
applicative.Applicative[A, B, HKTA, HKTB, HKTFAB]
|
||||||
|
chain.Chainable[A, B, HKTA, HKTB, HKTFAB]
|
||||||
|
}
|
21
internal/pointed/types.go
Normal file
21
internal/pointed/types.go
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
// 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 pointed
|
||||||
|
|
||||||
|
type Pointed[A, HKTA any] interface {
|
||||||
|
// Of lifts a value into its higher kinded type
|
||||||
|
Of(A) HKTA
|
||||||
|
}
|
43
io/generic/monad.go
Normal file
43
io/generic/monad.go
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
// Copyright (c) 2024 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 (
|
||||||
|
"github.com/IBM/fp-go/internal/monad"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ioMonad[A, B any, GA ~func() A, GB ~func() B, GAB ~func() func(A) B] struct{}
|
||||||
|
|
||||||
|
func (o *ioMonad[A, B, GA, GB, GAB]) Of(a A) GA {
|
||||||
|
return Of[GA, A](a)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *ioMonad[A, B, GA, GB, GAB]) Map(f func(A) B) func(GA) GB {
|
||||||
|
return Map[GA, GB, A, B](f)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *ioMonad[A, B, GA, GB, GAB]) Chain(f func(A) GB) func(GA) GB {
|
||||||
|
return Chain[GA, GB, A, B](f)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *ioMonad[A, B, GA, GB, GAB]) Ap(fa GA) func(GAB) GB {
|
||||||
|
return Ap[GB, GAB, GA, B, A](fa)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Monad implements the monadic operations for [Option]
|
||||||
|
func Monad[A, B any, GA ~func() A, GB ~func() B, GAB ~func() func(A) B]() monad.Monad[A, B, GA, GB, GAB] {
|
||||||
|
return &ioMonad[A, B, GA, GB, GAB]{}
|
||||||
|
}
|
26
io/monad.go
Normal file
26
io/monad.go
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
// Copyright (c) 2024 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 io
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/IBM/fp-go/internal/monad"
|
||||||
|
G "github.com/IBM/fp-go/io/generic"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Monad returns the monadic operations for [IO]
|
||||||
|
func Monad[A, B any]() monad.Monad[A, B, IO[A], IO[B], IO[func(A) B]] {
|
||||||
|
return G.Monad[A, B, IO[A], IO[B], IO[func(A) B]]()
|
||||||
|
}
|
45
iterator/stateless/generic/monad.go
Normal file
45
iterator/stateless/generic/monad.go
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
// Copyright (c) 2024 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 (
|
||||||
|
"github.com/IBM/fp-go/internal/monad"
|
||||||
|
O "github.com/IBM/fp-go/option"
|
||||||
|
T "github.com/IBM/fp-go/tuple"
|
||||||
|
)
|
||||||
|
|
||||||
|
type iteratorMonad[A, B any, GA ~func() O.Option[T.Tuple2[GA, A]], GB ~func() O.Option[T.Tuple2[GB, B]], GAB ~func() O.Option[T.Tuple2[GAB, func(A) B]]] struct{}
|
||||||
|
|
||||||
|
func (o *iteratorMonad[A, B, GA, GB, GAB]) Of(a A) GA {
|
||||||
|
return Of[GA, A](a)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *iteratorMonad[A, B, GA, GB, GAB]) Map(f func(A) B) func(GA) GB {
|
||||||
|
return Map[GB, GA, func(A) B, A, B](f)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *iteratorMonad[A, B, GA, GB, GAB]) Chain(f func(A) GB) func(GA) GB {
|
||||||
|
return Chain[GB, GA, A, B](f)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *iteratorMonad[A, B, GA, GB, GAB]) Ap(fa GA) func(GAB) GB {
|
||||||
|
return Ap[GAB, GB, GA, A, B](fa)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Monad implements the monadic operations for iterators
|
||||||
|
func Monad[A, B any, GA ~func() O.Option[T.Tuple2[GA, A]], GB ~func() O.Option[T.Tuple2[GB, B]], GAB ~func() O.Option[T.Tuple2[GAB, func(A) B]]]() monad.Monad[A, B, GA, GB, GAB] {
|
||||||
|
return &iteratorMonad[A, B, GA, GB, GAB]{}
|
||||||
|
}
|
26
iterator/stateless/monad.go
Normal file
26
iterator/stateless/monad.go
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
// Copyright (c) 2024 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 (
|
||||||
|
"github.com/IBM/fp-go/internal/monad"
|
||||||
|
G "github.com/IBM/fp-go/iterator/stateless/generic"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Monad returns the monadic operations for an [Iterator]
|
||||||
|
func Monad[A, B any]() monad.Monad[A, B, Iterator[A], Iterator[B], Iterator[func(A) B]] {
|
||||||
|
return G.Monad[A, B, Iterator[A], Iterator[B], Iterator[func(A) B]]()
|
||||||
|
}
|
43
option/monad.go
Normal file
43
option/monad.go
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
// Copyright (c) 2024 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 option
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/IBM/fp-go/internal/monad"
|
||||||
|
)
|
||||||
|
|
||||||
|
type optionMonad[A, B any] struct{}
|
||||||
|
|
||||||
|
func (o *optionMonad[A, B]) Of(a A) Option[A] {
|
||||||
|
return Of[A](a)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *optionMonad[A, B]) Map(f func(A) B) func(Option[A]) Option[B] {
|
||||||
|
return Map[A, B](f)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *optionMonad[A, B]) Chain(f func(A) Option[B]) func(Option[A]) Option[B] {
|
||||||
|
return Chain[A, B](f)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (o *optionMonad[A, B]) Ap(fa Option[A]) func(Option[func(A) B]) Option[B] {
|
||||||
|
return Ap[B, A](fa)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Monad implements the monadic operations for [Option]
|
||||||
|
func Monad[A, B any]() monad.Monad[A, B, Option[A], Option[B], Option[func(A) B]] {
|
||||||
|
return &optionMonad[A, B]{}
|
||||||
|
}
|
Reference in New Issue
Block a user