|
| 1 | +package kategory |
| 2 | + |
| 3 | +import io.kotlintest.properties.Gen |
| 4 | +import io.kotlintest.properties.forAll |
| 5 | + |
| 6 | +object MonadErrorLaws { |
| 7 | + |
| 8 | + inline fun <reified F> laws(M: MonadError<F, Throwable> = monadError<F, Throwable>(), EQ: Eq<HK<F, Int>>): List<Law> = |
| 9 | + MonadLaws.laws(M, EQ) + listOf( |
| 10 | + Law("Monad Error Laws: left zero", { monadErrorLeftZero(M, EQ) }), |
| 11 | + Law("Monad Error Laws: ensure consistency", { monadErrorEnsureConsistency(M, EQ) }) |
| 12 | + ) |
| 13 | + |
| 14 | + inline fun <reified F> monadErrorLeftZero(M: MonadError<F, Throwable> = monadError<F, Throwable>(), EQ: Eq<HK<F, Int>>): Unit = |
| 15 | + forAll(genFunctionAToB<Int, HK<F, Int>>(genApplicative(Gen.int(), M)), genThrowable(), { f: (Int) -> HK<F, Int>, e: Throwable -> |
| 16 | + M.flatMap(M.raiseError<Int>(e), f).equalUnderTheLaw(M.raiseError<Int>(e), EQ) |
| 17 | + }) |
| 18 | + |
| 19 | + inline fun <reified F> monadErrorEnsureConsistency(M: MonadError<F, Throwable> = monadError<F, Throwable>(), EQ: Eq<HK<F, Int>>): Unit = |
| 20 | + forAll(genApplicative(Gen.int(), M), genThrowable(), genFunctionAToB<Int, Boolean>(Gen.bool()), { fa: HK<F, Int>, e: Throwable, p: (Int) -> Boolean -> |
| 21 | + M.ensure(fa, { e }, p).equalUnderTheLaw(M.flatMap(fa, { a -> if (p(a)) M.pure(a) else M.raiseError(e) }), EQ) |
| 22 | + }) |
| 23 | + |
| 24 | +} |
0 commit comments