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)