|
|
|
@ -8,6 +8,7 @@ import Control.MonadPlus (class MonadPlus, class Alternative, class Alt, class P |
|
|
|
|
import Control.Monad.Reader.Class (class MonadReader, local, class MonadAsk, ask) |
|
|
|
|
import Control.Monad.State.Class (class MonadState, state) |
|
|
|
|
import Control.Monad.Trans.Class (class MonadTrans, lift) |
|
|
|
|
import Control.Monad.Rec.Class (class MonadRec, Step(..)) |
|
|
|
|
import Data.Functor (map) |
|
|
|
|
import Data.Tuple.Nested ((/\)) |
|
|
|
|
import Data.List (List(Nil), (:)) |
|
|
|
@ -78,3 +79,17 @@ instance MonadState s m => MonadState s (SFKT m) where |
|
|
|
|
|
|
|
|
|
instance Lazy (SFKT m a) where |
|
|
|
|
defer f = SFKT (\sk fk -> unSFKT (f unit) sk fk) |
|
|
|
|
|
|
|
|
|
instance Monad m => MonadRec (SFKT m) where |
|
|
|
|
tailRecM :: forall acc b. (acc -> SFKT m (Step acc b)) -> acc -> SFKT m b |
|
|
|
|
tailRecM f a0 = SFKT \sk fk -> go {sk: sk, fk: fk} a0 |
|
|
|
|
where |
|
|
|
|
go :: forall ans. { sk :: SK (m ans) b, fk :: FK (m ans) } -> acc -> m ans |
|
|
|
|
go r@{sk,fk} an = |
|
|
|
|
let |
|
|
|
|
(SFKT sfktf) = f an |
|
|
|
|
success st fk' = |
|
|
|
|
case st of |
|
|
|
|
Loop an' -> go r an' |
|
|
|
|
Done b -> sk b fk' |
|
|
|
|
in sfktf success fk |
|
|
|
|