Skip to content

Commit 251b487

Browse files
add selectM law
1 parent 2522d09 commit 251b487

File tree

1 file changed

+9
-1
lines changed
  • modules/core/arrow-test/src/main/kotlin/arrow/test/laws

1 file changed

+9
-1
lines changed

modules/core/arrow-test/src/main/kotlin/arrow/test/laws/MonadLaws.kt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package arrow.test.laws
33
import arrow.Kind
44
import arrow.core.Left
55
import arrow.core.Right
6+
import arrow.core.identity
67
import arrow.data.Kleisli
78
import arrow.free.Free
89
import arrow.free.bindingStackSafe
@@ -28,7 +29,8 @@ object MonadLaws {
2829
Law("Monad Laws: monad comprehensions binding in other threads") { M.monadComprehensionsBindInContext(EQ) },
2930
Law("Monad Laws: stack-safe//unsafe monad comprehensions equivalence") { M.equivalentComprehensions(EQ) },
3031
Law("Monad Laws: stack safe") { M.stackSafety(5000, EQ) },
31-
Law("Monad Laws: stack safe comprehensions") { M.stackSafetyComprehensions(5000, EQ) }
32+
Law("Monad Laws: stack safe comprehensions") { M.stackSafetyComprehensions(5000, EQ) },
33+
Law("Monad Laws: selectM == select when Selective has a monad instance") { M.selectEQSelectM(EQ) }
3234
)
3335

3436
fun <F> Monad<F>.leftIdentity(EQ: Eq<Kind<F, Int>>): Unit =
@@ -102,6 +104,12 @@ object MonadLaws {
102104
}.equalUnderTheLaw(just(num + 2), EQ)
103105
}
104106

107+
fun <F> Monad<F>.selectEQSelectM(EQ: Eq<Kind<F, Int>>): Unit =
108+
forAll(Gen.either(Gen.int(), Gen.int())) { either ->
109+
val f = just<(Int) -> Int>(::identity)
110+
just(either).select(f).equalUnderTheLaw(just(either).selectM(f), EQ)
111+
}
112+
105113
fun <F> Monad<F>.monadComprehensionsBindInContext(EQ: Eq<Kind<F, Int>>): Unit =
106114
forFew(5, Gen.intSmall()) { num: Int ->
107115
binding {

0 commit comments

Comments
 (0)