Skip to content

Commit

Permalink
Cleanup Kleisli and OptionT
Browse files Browse the repository at this point in the history
  • Loading branch information
mpilquist committed Oct 16, 2023
1 parent 05e2260 commit f1112b3
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 8 deletions.
14 changes: 8 additions & 6 deletions core/shared/src/main/scala/leopards/Kleisli.scala
Expand Up @@ -18,13 +18,15 @@ package leopards

opaque type Kleisli[F[_], A, B] = A => F[B]

extension [F[_], A, B](k: Kleisli[F, A, B]) def apply(a: A): F[B] = k(a)

object Kleisli:
def apply[F[_], A, B](f: A => F[B]): Kleisli[F, A, B] = f

given [F[_], A](using F: Monad[F]): Monad[[B] =>> Kleisli[F, A, B]] with
def pure[B](b: B) = Kleisli(_ => F.pure(b))
extension [B](k: Kleisli[F, A, B])
def flatMap[C](f: B => Kleisli[F, A, C]) =
a => k(a).flatMap(b => f(b)(a))
extension [F[_], A, B](k: Kleisli[F, A, B]) def apply(a: A): F[B] = k(a)

given [F[_], A](using F: Monad[F]): Monad[[B] =>> Kleisli[F, A, B]] with
def pure[B](b: B) = Kleisli(_ => F.pure(b))
extension [B](k: Kleisli[F, A, B])
def flatMap[C](f: B => Kleisli[F, A, C]) =
a => k(a).flatMap(b => f(b)(a))

4 changes: 2 additions & 2 deletions core/shared/src/main/scala/leopards/OptionT.scala
Expand Up @@ -27,12 +27,12 @@ object OptionT:
def liftF[F[_], A](fa: F[A])(using Functor[F]): OptionT[F, A] =
apply(fa.map(Some(_)))

def liftK[F[_]](using Functor[F]): F ~> ([X] =>> OptionT[F, X]) =
def liftK[F[_]](using Functor[F]): [X] => F[X] => OptionT[F, X] =
[X] => liftF(_: F[X])

extension [F[_], A](fa: OptionT[F, A])
def value: F[Option[A]] = fa
def mapK[G[_]](fk: F ~> G): OptionT[G, A] = fk(fa.value)
def mapK[G[_]](fk: [X] => F[X] => G[X]): OptionT[G, A] = fk(fa.value)

given [F[_]](using F: Functor[F]): Functor[[X] =>> OptionT[F, X]] =
new OptionTFunctor[F] {}
Expand Down

0 comments on commit f1112b3

Please sign in to comment.