module Equation.Iterator where import Language.Haskell.TH import Language.Haskell.ER.Syntax import Language.Haskell.ER.HaskellRewrite import Language.Haskell.ER.MiscRewrite import Language.Haskell.ER.Utils import Language.Haskell.ER.Frees import Control.Monad.ST import Program.Iterator import Iterator import ImpList dictionary :: [ UniHaskellRewrite ] dictionary = map HaskellRewriteExp [ equation "/Program/Iterator/Equations/case to iterator" $(quote [| case e of { [] -> e3 ; (x:xs) -> e2 x xs ; _ -> e4 } |]) $(quote [| iteratorCase e (\ ixs -> do i <- next ixs case i of Nothing -> e3 Just x -> do xs <- iteratorToList ixs e2 x xs ) |]) Nothing , equation "/Program/Iterator/Equations/case to iterator (2)" $(quote [| case e of { [] -> e3 ; (x:xs) -> e2 x xs } |]) $(quote [| iteratorCase e (\ ixs -> do i <- next ixs case i of Nothing -> e3 Just x -> do xs <- iteratorToList ixs e2 x xs ) |]) Nothing , equation "/Program/Iterator/Equations/Iterator fusion" -- condition; xs is not free is e $(quote [| (>>=) (iteratorToList ixs) (\ xs -> (iteratorCase xs e)) |]) $(quote [| e ixs |]) Nothing ,equation "/Program/Iterator/Equations/Push Action into iterator case" $(quote [| (>>) e (iteratorCase xs e2) |]) $(quote [| iteratorCase xs (\ ixs -> e >> e2 ixs) |]) Nothing , equation "/Program/Iterator/Equations/iteratorToList def(2)" $(quote [| iteratorToList ixs |]) $(quote [| do v <- iteratorToIterator' ixs return (iterator'ToList v) |]) Nothing , equation "/Program/Iterator/Equations/iteratorCase (iterator'ToList xs) => iteratorCase'" $(quote [| iteratorCase (iterator'ToList e) |]) $(quote [| iteratorCase' e |]) Nothing , equation "/Program/Iterator/Equations/iteratorCase (myListBuildingToList e1) e2" $(quote [| iteratorCase (ImpList.myListBuildingToList e1) e2 |]) $(quote [| do is <- myListBuildingToIterator e1 e2 is |]) Nothing ]