Skip to content

Commit c067919

Browse files
first Selective instances
1 parent c2af6b7 commit c067919

File tree

3 files changed

+20
-0
lines changed

3 files changed

+20
-0
lines changed

modules/core/arrow-core-extensions/src/main/kotlin/arrow/core/extensions/function0.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package arrow.core.extensions
22

3+
import arrow.Kind
34
import arrow.core.*
45
import arrow.core.extensions.function0.monad.monad
56
import arrow.extension
@@ -42,6 +43,12 @@ interface Function0Applicative : Applicative<ForFunction0> {
4243
Function0.just(a)
4344
}
4445

46+
@extension
47+
interface Function0Selective : Selective<ForFunction0>, Function0Applicative {
48+
override fun <A, B> Function0Of<Either<A, B>>.select(f: Kind<ForFunction0, (A) -> B>): Kind<ForFunction0, B> =
49+
fix().flatMap { it.fold({l -> just(l).ap(f)}, {r -> just(identity(r))})}
50+
}
51+
4552
@extension
4653
interface Function0Monad : Monad<ForFunction0> {
4754
override fun <A, B> Function0Of<A>.ap(ff: Function0Of<(A) -> B>): Function0<B> =

modules/core/arrow-core-extensions/src/main/kotlin/arrow/core/extensions/id.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
@file:Suppress("UnusedImports")
2+
23
package arrow.core.extensions
34

45
import arrow.Kind
@@ -58,6 +59,12 @@ interface IdApplicative : Applicative<ForId> {
5859
Id.just(a)
5960
}
6061

62+
@extension
63+
interface IdSelective : Selective<ForId>, IdApplicative {
64+
override fun <A, B> IdOf<Either<A, B>>.select(f: Kind<ForId, (A) -> B>): Kind<ForId, B> =
65+
fix().flatMap { it.fold({ l -> just(l).ap(f) }, { r -> just(identity(r)) }) }
66+
}
67+
6168
@extension
6269
interface IdMonad : Monad<ForId> {
6370
override fun <A, B> IdOf<A>.ap(ff: IdOf<(A) -> B>): Id<B> =

modules/core/arrow-core-extensions/src/main/kotlin/arrow/core/extensions/option.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,12 @@ interface OptionApplicative : Applicative<ForOption> {
123123
Option.just(a)
124124
}
125125

126+
@extension
127+
interface OptionSelective : Selective<ForOption>, OptionApplicative {
128+
override fun <A, B> OptionOf<Either<A, B>>.select(f: OptionOf<(A) -> B>): Option<B> =
129+
fix().flatMap { it.fold({l -> just(l).ap(f)}, {r -> just(identity(r))})}
130+
}
131+
126132
@extension
127133
interface OptionMonad : Monad<ForOption> {
128134
override fun <A, B> OptionOf<A>.ap(ff: OptionOf<(A) -> B>): Option<B> =

0 commit comments

Comments
 (0)