Skip to content

Commit 525efc0

Browse files
fix rebase conflicts and add StateT instances under new system
1 parent c9d7287 commit 525efc0

File tree

7 files changed

+39
-17
lines changed

7 files changed

+39
-17
lines changed

kategory-core/src/main/kotlin/kategory/data/Option.kt

+1-2
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,7 @@ package kategory
1313
Monad::class,
1414
Foldable::class,
1515
Traverse::class,
16-
MonadFilter::class,
17-
MonadCombine::class)
16+
MonadFilter::class)
1817
sealed class Option<out A> : OptionKind<A> {
1918

2019
companion object {

kategory-core/src/main/kotlin/kategory/data/StateT.kt

+8
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ class StateT<F, S, A>(
1515

1616
fun <F, S, A> invokeF(runF: StateTFunKind<F, S, A>): StateT<F, S, A> = StateT(runF)
1717

18+
fun <F, S, A> lift(fa: HK<F, A>, MF: Monad<F>): StateT<F, S, A> = StateT(MF.pure({ s -> MF.map(fa, { a -> Tuple2(s, a) }) }))
19+
1820
inline fun <reified F, S> functor(FF: Functor<F> = functor<F>()): StateTFunctorInstance<F, S> =
1921
StateTFunctorInstanceImplicits.instance(FF)
2022

@@ -30,6 +32,12 @@ class StateT<F, S, A>(
3032
inline fun <reified F, S> semigroupK(MF: Monad<F> = monad<F>(), SF: SemigroupK<F> = semigroupK<F>()): StateTSemigroupKInstance<F, S> =
3133
StateTSemigroupKInstanceImplicits.instance(MF, SF)
3234

35+
inline fun <reified F, S> monadCombine(MCF: MonadCombine<F> = monadCombine<F>()): StateTMonadCombineInstance<F, S> =
36+
StateTMonadCombineInstanceImplicits.instance(MCF)
37+
38+
inline fun <reified F, S, reified E> monadError(ME: MonadError<F, E> = monadError<F, E>()) : StateTMonadErrorInstance<F, S, E> =
39+
StateTMonadErrorImplicits.instance(ME)
40+
3341
fun <F, S> get(AF: Applicative<F>): StateT<F, S, S> = StateT(AF.pure({ s: S -> AF.pure(Tuple2(s, s)) }))
3442

3543
fun <F, S> set(s: S, AF: Applicative<F>): StateT<F, S, Unit> = StateT(AF.pure({ _: S -> AF.pure(Tuple2(s, Unit)) }))

kategory-core/src/main/kotlin/kategory/instances/StateTInstances.kt

+28-9
Original file line numberDiff line numberDiff line change
@@ -95,20 +95,39 @@ object StateTSemigroupKInstanceImplicits {
9595
}
9696
}
9797

98-
interface StateTMonadCombine<F, S> : MonadCombine<StateTKindPartial<F, S>>, StateTMonad<F, S>, StateTSemigroupK<F, S> {
99-
override fun F(): MonadCombine<F>
100-
override fun G(): MonadCombine<F> = F()
98+
interface StateTMonadCombineInstance<F, S> : MonadCombine<StateTKindPartial<F, S>>, StateTMonadInstance<F, S>, StateTSemigroupKInstance<F, S> {
10199

102-
override fun <A> empty(): StateT<F, S, A> = liftT(F().empty())
100+
override fun MF(): MonadCombine<F>
101+
override fun SF(): SemigroupK<F> = MF()
103102

104-
fun <A> liftT(ma: HK<F, A>): StateT<F, S, A> = StateT(F(), F().pure({ s: S -> F().map(ma, { a: A -> s toT a }) }))
103+
override fun <A> empty(): HK<StateTKindPartial<F, S>, A> = liftT(MF().empty())
104+
105+
fun <A> liftT(ma: HK<F, A>): StateT<F, S, A> = StateT(MF().pure({ s: S -> MF().map(ma, { a: A -> s toT a }) }))
106+
}
107+
108+
object StateTMonadCombineInstanceImplicits {
109+
@JvmStatic
110+
fun <F, S> instance(MCF: MonadCombine<F>): StateTMonadCombineInstance<F, S> = object : StateTMonadCombineInstance<F, S> {
111+
override fun FF(): Functor<F> = MCF
112+
override fun MF(): MonadCombine<F> = MCF
113+
114+
}
105115
}
106116

107-
interface StateTMonadError<F, S, E> : StateTMonad<F, S>, MonadError<StateTKindPartial<F, S>, E> {
108-
override fun F(): MonadError<F, E>
117+
interface StateTMonadErrorInstance<F, S, E> : StateTMonadInstance<F, S>, MonadError<StateTKindPartial<F, S>, E> {
118+
override fun MF(): MonadError<F, E>
109119

110-
override fun <A> raiseError(e: E): StateT<F, S, A> = StateT.lift(F().raiseError(e), F())
120+
override fun <A> raiseError(e: E): HK<StateTKindPartial<F, S>, A> = StateT.lift(MF().raiseError(e), MF())
111121

112122
override fun <A> handleErrorWith(fa: HK<StateTKindPartial<F, S>, A>, f: (E) -> HK<StateTKindPartial<F, S>, A>): StateT<F, S, A> =
113-
StateT(F(), F().pure({ s -> F().handleErrorWith(fa.runM(s), { e -> f(e).runM(s) }) }))
123+
StateT(MF().pure({ s -> MF().handleErrorWith(fa.runM(s, MF()), { e -> f(e).runM(s, MF()) }) }))
114124
}
125+
126+
object StateTMonadErrorImplicits {
127+
@JvmStatic
128+
fun <F, S, E> instance(ME: MonadError<F, E>): StateTMonadErrorInstance<F, S, E> = object : StateTMonadErrorInstance<F, S, E> {
129+
override fun FF(): Functor<F> = ME
130+
override fun MF(): MonadError<F, E> = ME
131+
}
132+
}
133+

kategory-core/src/test/kotlin/kategory/data/OptionTest.kt

-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ class OptionTest : UnitSpec() {
4242
//testLaws(MonadErrorLaws.laws(monadError<OptionHK, Unit>(), Eq.any(), EQ_EITHER)) TODO reenable once the MonadErrorLaws are parametric to `E`
4343
testLaws(TraverseLaws.laws(Option.traverse(), Option.monad(), ::Some, Eq.any()))
4444
testLaws(MonadFilterLaws.laws(Option.monadFilter(), ::Some, Eq.any()))
45-
testLaws(MonadCombineLaws.laws(Option.monadCombine(), ::Some, { Some({ a: Int -> a * 2 }) }, Eq.any(), Eq.any()))
4645

4746
"fromNullable should work for both null and non-null values of nullable types" {
4847
forAll { a: Int? ->

kategory-core/src/test/kotlin/kategory/data/StateTTests.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ class StateTTests : UnitSpec() {
4444
{ StateT.lift(ListKW.pure({ s: Int -> s * 2 }), ListKW.monad()) },
4545
object : Eq<HK<StateTKindPartial<ListKWHK, Int>, Int>> {
4646
override fun eqv(a: HK<StateTKindPartial<ListKWHK, Int>, Int>, b: HK<StateTKindPartial<ListKWHK, Int>, Int>): Boolean =
47-
a.runM(1) == b.runM(1)
47+
a.runM(1, ListKW.monad()) == b.runM(1, ListKW.monad())
4848
}))
4949

5050
}

kategory-core/src/test/kotlin/kategory/data/WriterTTest.kt

-2
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,6 @@ package kategory
22

33
import io.kotlintest.KTestJUnitRunner
44
import io.kotlintest.matchers.shouldNotBe
5-
import kategory.laws.FunctorFilterLaws
6-
import kategory.laws.MonadFilterLaws
75
import org.junit.runner.RunWith
86

97
@RunWith(KTestJUnitRunner::class)

kategory-core/src/test/kotlin/kategory/instances/StringInstancesTest.kt

+1-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package kategory.instances
33
import io.kotlintest.KTestJUnitRunner
44
import io.kotlintest.matchers.shouldNotBe
55
import kategory.*
6-
import kategory.laws.FunctorFilterLaws
76
import org.junit.runner.RunWith
87

98
@RunWith(KTestJUnitRunner::class)
@@ -14,4 +13,4 @@ class StringInstancesTest : UnitSpec() {
1413
monoid<String>() shouldNotBe null
1514
}
1615
}
17-
}
16+
}

0 commit comments

Comments
 (0)