Something
public text v1 · immutableimport Control.Arrow
data DCont r a = DReturn a | DShift ((a -> DCont r r) -> DCont r r)
shift :: ((a -> DCont r r) -> DCont r r) -> DCont r a
shift = DShift
reset :: DCont r r -> r
reset act = reset' act return
reset' :: DCont r a -> (a -> DCont r r) -> r
reset' (DReturn val) rem = reset (rem val)
reset' (DShift f) rem = reset (f rem)
instance Monad (DCont r) where
return = DReturn
DReturn val >>= rem = rem val
DShift f >>= rem = DShift (\rem' -> f (rem >>> rem'))