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
        ]
