module Control.Isomorphism.Partial.Derived ( foldl, swap23 ) where import Prelude () import Control.Category (Category (id, (.))) import Control.Isomorphism.Partial.Iso (Iso) import Control.Isomorphism.Partial.Prim import Control.Isomorphism.Partial.Constructors (cons, nil) foldl :: Iso (alpha, beta) alpha -> Iso (alpha, [beta]) alpha foldl i = inverse unit . (id *** inverse nil) . iterateIso (step i) where step i = (i *** id) . associate . (id *** inverse cons) swap23 :: Iso (a, (b, c)) (a, (c, b)) swap23 = id *** commute