Packages

p

cats

mtl

package mtl

Source
package.scala
Linear Supertypes
AnyRef, Any
Ordering
  1. Alphabetic
  2. By Inheritance
Inherited
  1. mtl
  2. AnyRef
  3. Any
  1. Hide All
  2. Show All
Visibility
  1. Public
  2. All

Type Members

  1. trait Ask[F[_], +E] extends Serializable

    Ask[F, E] lets you access an E value in the F[_] context.

    Ask[F, E] lets you access an E value in the F[_] context.

    Intuitively, this means that an E value is required as an input to get "out" of the F[_] context.

    Ask[F, E] has one external law:

    def askAddsNoEffects[A](fa: F[A]) = {
      (ask *> fa) <-> fa
    }

    Ask[F, E] has one internal law:

    def readerIsAskAndMap[A](f: E => A) = {
      ask.map(f) <-> reader(f)
    }
    Annotations
    @implicitNotFound( ... )
  2. trait Censor[F[_], L] extends Listen[F, L]
    Annotations
    @implicitNotFound( ... )
  3. trait Chronicle[F[_], E] extends Serializable
    Annotations
    @implicitNotFound( ... )
  4. trait Handle[F[_], E] extends Raise[F, E] with Serializable
    Annotations
    @implicitNotFound( ... )
  5. trait Listen[F[_], L] extends Tell[F, L] with Serializable

    Listen[F, L] is a function F[A] => F[(A, L)] which exposes some state that is contained in all F[A] values, and can be modified using tell.

    Listen[F, L] is a function F[A] => F[(A, L)] which exposes some state that is contained in all F[A] values, and can be modified using tell.

    Listen has two external laws:

    def listenRespectsTell(l: L) = {
      listen(tell(l)) <-> tell(l).as(((), l))
    }
    
    def listenAddsNoEffects(fa: F[A]) = {
      listen(fa).map(_._1) <-> fa
    }

    Listen has one internal law:

    def listensIsListenThenMap(fa: F[A], f: L => B) = {
      listens(fa)(f) <-> listen(fa).map { case (a, l) => (a, f(l)) }
    }
    Annotations
    @implicitNotFound( ... )
  6. trait Local[F[_], E] extends Ask[F, E] with Serializable

    Local[F, E] lets you alter the E value that is observed by an F[A] value using ask; the modification can only be observed from within that F[A] value.

    Local[F, E] lets you alter the E value that is observed by an F[A] value using ask; the modification can only be observed from within that F[A] value.

    Local[F, E] has three external laws:

    def askReflectsLocal(f: E => E) = {
      local(f)(ask) <-> ask map f
    }
    
    def localPureIsPure[A](a: A, f: E => E) = {
      local(f)(pure(a)) <-> pure(a)
    }
    
    def localDistributesOverAp[A, B](fa: F[A], ff: F[A => B], f: E => E) = {
      local(f)(ff ap fa) <-> local(f)(ff) ap local(f)(fa)
    }

    Local has one internal law:

    def scopeIsLocalConst(fa: F[A], e: E) = {
      scope(e)(fa) <-> local(_ => e)(fa)
    }
    Annotations
    @implicitNotFound( ... )
  7. trait MonadPartialOrder[F[_], G[_]] extends ~>[F, G]

    Encapsulates the notion of a monad, G, which contains all of the effects of some other monad, F.

    Encapsulates the notion of a monad, G, which contains all of the effects of some other monad, F. This means that any effect of type F[A] can be lifted to G[A], such that both F and G form monads and the lifting distributes over flatMap and pure.

    Original idea by Kris Nuttycombe.

  8. trait Raise[F[_], -E] extends Serializable

    Raise[F, E] expresses the ability to raise errors of type E in a functorial F[_] context.

    Raise[F, E] expresses the ability to raise errors of type E in a functorial F[_] context. This means that a value of type F[A] may contain no A values but instead an E error value, and further map calls will not have any values to execute the passed function on.

    Raise has no external laws.

    Raise has two internal laws:

    def catchNonFatalDefault[A](a: => A)(f: Throwable => E)(implicit A: Applicative[F]) = {
      catchNonFatal(a)(f) <-> try {
        A.pure(a)
      } catch {
        case NonFatal(ex) => raise(f(ex))
      }
    }
    
    def ensureDefault[A](fa: F[A])(error: => E)(predicate: A => Boolean)(implicit A: Monad[F]) = {
      ensure(fa)(error)(predicate) <-> for {
        a <- fa
        _ <- if (predicate(a)) pure(()) else raise(error)
      } yield a
    }

    Raise has one free law, i.e. a law guaranteed by parametricity:

    def failThenFlatMapFails[A, B](ex: E, f: A => F[B]) = {
      fail(ex).flatMap(f) <-> fail(ex)
    }
    guaranteed by:
      fail[X](ex) <-> fail[F[Y]](ex) // parametricity
      fail[X](ex).map(f) <-> fail[F[Y]](ex)  // map must have no effect, because there's no X value
      fail[X](ex).map(f).join <-> fail[F[Y]].join // add join to both sides
      fail(ex).flatMap(f) <-> fail(ex) // join is equal, because there's no inner value to flatten effects from
      // QED.
    Annotations
    @implicitNotFound( ... )
  9. trait Stateful[F[_], S] extends Serializable

    Stateful[F, S] is the capability to access and modify a state value from inside the F[_] context, using set(s: S): F[Unit] and get: F[S].

    Stateful[F, S] is the capability to access and modify a state value from inside the F[_] context, using set(s: S): F[Unit] and get: F[S].

    Stateful has four external laws:

    def getThenSetDoesNothing = {
      get >>= set <-> pure(())
    }
    def setThenGetReturnsSetted(s: S) = {
      set(s) *> get <-> set(s) *> pure(s)
    }
    def setThenSetSetsLast(s1: S, s2: S) = {
      set(s1) *> set(s2) <-> set(s2)
    }
    def getThenGetGetsOnce = {
      get *> get <-> get
    }

    Stateful has two internal law:

    def modifyIsGetThenSet(f: S => S) = {
      modify(f) <-> (inspect(f) flatMap set)
    }
    
    def inspectLaw[A](f: S => A) = {
      inspect(f) <-> (get map f)
    }
    Annotations
    @implicitNotFound( ... )
  10. trait Tell[F[_], -L] extends Serializable

    Tell[F, L] is the ability to "log" values L inside a context F[_], as an effect.

    Tell[F, L] is the ability to "log" values L inside a context F[_], as an effect.

    Tell has no external laws.

    Tell has one internal law:

    def writerIsTellAndMap(a: A, l: L) = {
      (tell(l) as a) <-> writer(a, l)
    }
    
    def tupleIsWriterFlipped(a: A, l: L) = {
      writer(a, l) <-> tuple((l, a))
    }
    Annotations
    @implicitNotFound( ... )

Value Members

  1. object Ask extends AskInstances with Serializable
  2. object Censor extends CensorInstances with Serializable
  3. object Chronicle extends ChronicleInstances with Serializable
  4. object Handle extends HandleInstances with Serializable
  5. object Listen extends ListenInstances with Serializable
  6. object Local extends LocalInstances with Serializable
  7. object MonadPartialOrder extends MonadPartialOrderInstances with Serializable
  8. object Raise extends RaiseInstances with Serializable
  9. object Stateful extends StatefulInstances with Serializable
  10. object Tell extends TellInstances with Serializable

Inherited from AnyRef

Inherited from Any

Ungrouped