partial-isomorphisms-0.2.4.0: src/Control/Isomorphism/Partial/Derived.hs
module Control.Isomorphism.Partial.Derived
( foldl
) where
import Prelude ()
import Control.Category (Category (id, (.)))
import Control.Isomorphism.Partial.Prim (Iso, inverse, unit, associate, iterate, (***))
import Control.Isomorphism.Partial.Constructors (cons, nil)
foldl :: Iso (alpha, beta) alpha -> Iso (alpha, [beta]) alpha
foldl i = inverse unit
. (id *** inverse nil)
. iterate (step i) where
step i' = (i' *** id)
. associate
. (id *** inverse cons)