Stateful
@implicitNotFound("Could not find an implicit instance of Stateful[${F}, ${S}]. If you wish\nto ensure that the statefulness of this function is confined within this\nscope, you may want to construct a value of type StateT for this call-site,\nrather than ${F}. An example type:\n\n StateT[${F}, ${S}, *]\n\nIf you wish the state of ${S} to be threaded *through* this location, rather\nthan being scoped entirely within it, you should add an implicit parameter\nof this type to your function. For example:\n\n (implicit fstate: Stateful[${F}, ${S}])\n") trait Stateful[F <: ([_$1] =>> Any), S] extends Serializable
Stateful[F, S]
is the capability to access and modify a state valuefrom 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
}
}}}
{{{
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)
}
}}}
inspect(f) <-> (get map f)
}
}}}
- Companion
- object
trait Serializable
class Object
trait Matchable
class Any