module Medium.Controlled where
class C medium where
control :: (control -> medium control a -> medium control a)
switchBinary ::
(a -> b) ->
(medium control a -> medium control a -> b) ->
(medium control a -> medium control a -> b) ->
(control -> medium control a -> b) ->
(b -> medium control a -> b)
switchList ::
(a -> b) ->
([medium control a] -> b) ->
([medium control a] -> b) ->
(control -> medium control a -> b) ->
medium control a -> b
foldList :: C medium =>
(a->b) -> ([b]->b) -> ([b]->b) -> (c->b->b) -> medium c a -> b
foldList f g h k =
let recourse = foldList f g h k
recurseAll = map recourse
in switchList f (g . recurseAll) (h . recurseAll) (\c -> k c . recourse)
foldBin :: C medium =>
(a->b) -> (b->b->b) -> (b->b->b) -> (c->b->b) -> b -> medium c a -> b
foldBin f g h k z =
let recourse = foldBin f g h k z
recurseAll op x y = recourse x `op` recourse y
in switchBinary f (recurseAll g) (recurseAll h) (\c -> k c . recourse) z