Repository : ssh://darcs.haskell.org//srv/darcs/ghc

On branch  : 

http://hackage.haskell.org/trac/ghc/changeset/8f5c280004840b149bfd63c4b163940ffc252164

>---------------------------------------------------------------

commit 8f5c280004840b149bfd63c4b163940ffc252164
Author: Max Bolingbroke <batterseapo...@hotmail.com>
Date:   Tue Oct 25 23:54:54 2011 +0100

    I may have the perfect refactoring of Process2

>---------------------------------------------------------------

 .../supercompile/Supercompile/Drive/Process2.hs    |   76 +++++++++-----------
 1 files changed, 35 insertions(+), 41 deletions(-)

diff --git a/compiler/supercompile/Supercompile/Drive/Process2.hs 
b/compiler/supercompile/Supercompile/Drive/Process2.hs
index 6a6f575..de37efc 100644
--- a/compiler/supercompile/Supercompile/Drive/Process2.hs
+++ b/compiler/supercompile/Supercompile/Drive/Process2.hs
@@ -146,19 +146,19 @@ runScpM sc mx = mx >>= runDelayM eval_strat sc
     eval_strat = breadthFirst
 
 
-newtype HistoryT m a = HT { unHT :: History (State, RollbackScpM) -> m a }
+{--}
+type HistoryM = (->) (History (State, RollbackScpM))
 
-instance Functor m => Functor (HistoryT m) where
-    fmap f mx = HT $ \hist -> fmap f (unHT mx hist)
+runHistoryM :: HistoryM a -> a
+runHistoryM = flip ($) (mkHistory (cofmap fst wQO))
+{--}
 
-instance Applicative m => Applicative (HistoryT m) where
-    pure x = HT $ \_ -> pure x
-    mf <*> mx = HT $ \hist -> unHT mf hist <*> unHT mx hist
-
-instance Monad m => Monad (HistoryT m) where
-    return x = HT $ \_ -> return x
-    mx >>= fxmy = HT $ \hist -> unHT mx hist >>= \x -> unHT (fxmy x) hist
+{-
+type HistoryM = State.State (History (State, RollbackScpM))
 
+runHistoryM :: HistoryM a -> a
+runHistoryM = flip State.evalState (mkHistory (cofmap fst wQO))
+-}
 
 data Promise = P {
     fun        :: Var,      -- Name assigned in output program
@@ -171,31 +171,24 @@ data MemoState = MS {
     hNames   :: Stream Name
   }
 
-type MemoM = State.State MemoState
-
-runMemoM :: MemoM a -> a
-runMemoM = flip evalState $ MS { promises = [], hNames = h_names }
-  where h_names = listToStream $ zipWith (\i uniq -> mkSystemVarName uniq 
(mkFastString ('h' : show (i :: Int))))
-                                         [1..] (uniqsFromSupply 
hFunctionsUniqSupply)
-
-{-
-newtype MemoM a = MemoM { unMemoM :: MemoState -> (MemoState, a) }
+newtype MemoT m a = MT { unMT :: MemoState -> m (a, MemoState) }
 
-instance Functor MemoM where
-    fmap = liftM
+instance Functor m => Functor (MemoT m) where
+    fmap f mx = MT $ \s -> fmap (first f) (unMT mx s)
 
-instance Applicative MemoM where
+instance (Functor m, Monad m) => Applicative (MemoT m) where
     pure = return
     (<*>) = ap
 
-instance Monad MemoM where
-    return x = MemoM $ \s -> (s, x)
-    MemoM xf >>= fxmy = MemoM $ \s -> case xf s of (s', x) -> unMemoM (fxmy x) 
s'
+instance Monad m => Monad (MemoT m) where
+    return x = MT $ \s -> return (x, s)
+    mx >>= fxmy = MT $ \s -> unMT mx s >>= \(x, s) -> unMT (fxmy x) s
+
+runMemoT :: Functor m => MemoT m a -> m a
+runMemoT mx = fmap fst $ unMT mx MS { promises = [], hNames = h_names }
+  where h_names = listToStream $ zipWith (\i uniq -> mkSystemVarName uniq 
(mkFastString ('h' : show (i :: Int))))
+                                         [1..] (uniqsFromSupply 
hFunctionsUniqSupply)
 
-modify :: (MemoState -> (MemoState, a))
-       -> MemoM a
-modify = MemoM
--}
 
 promise :: State -> MemoState -> (Promise, MemoState)
 promise state ms = (p, ms)
@@ -212,33 +205,34 @@ promise state ms = (p, ms)
             hNames   = h_names'
           }
 
-memo :: (State -> ScpM (Deeds, Out FVedTerm))
-     -> State -> MemoM (ScpM (Deeds, Out FVedTerm))
-memo opt state = State.state $ \ms ->
+memo :: (State -> HistoryM (ScpM (Deeds, Out FVedTerm)))
+     -> State -> MemoT HistoryM (ScpM (Deeds, Out FVedTerm))
+memo opt state = MT $ \ms ->
      -- NB: If tb contains a dead PureHeap binding (hopefully impossible) then 
it may have a free variable that
      -- I can't rename, so "rename" will cause an error. Not observed in 
practice yet.
     case [ (p, (releaseStateDeed state, var (fun p) `applyAbsVars` map 
(renameAbsVar rn_lr) (abstracted p)))
          | p <- promises ms
          , Just rn_lr <- [(\res -> if isNothing res then pprTraceSC "no 
match:" (ppr (fun p)) res else res) $
                           match (meaning p) state]
-         ] of (p, res):_ -> (do { traceRenderScpM "=sc" (fun p, PrettyDoc 
(pPrintFullState True state), res)
-                                ; pure res }, ms)
-              _          -> (do { traceRenderScpM ">sc" (fun p, PrettyDoc 
(pPrintFullState True state))
-                                ; res <- opt state
-                                ; traceRenderScpM "<sc" (fun p, PrettyDoc 
(pPrintFullState False state), res)
-                                ; pure res }, ms')
+         ] of (p, res):_ -> pure $ (do { traceRenderScpM "=sc" (fun p, 
PrettyDoc (pPrintFullState True state), res)
+                                       ; pure res }, ms)
+              _          -> opt state >>= \mres -> return
+                                   (do { traceRenderScpM ">sc" (fun p, 
PrettyDoc (pPrintFullState True state))
+                                       ; res <- mres
+                                       ; traceRenderScpM "<sc" (fun p, 
PrettyDoc (pPrintFullState False state), res)
+                                       ; pure res }, ms')
                 where (p, ms') = promise state ms
 
 
 type RollbackScpM = () -- Generaliser -> ScpBM (Deeds, Out FVedTerm)
 
-sc' :: State -> HistoryT st ScpM (Deeds, Out FVedTerm)
+sc' :: State -> HistoryM (ScpM (Deeds, Out FVedTerm))
 sc' state = error "FIXME"
 
-sc :: State -> HistoryT st MemoM (ScpM (Deeds, Out FVedTerm))
+sc :: State -> MemoT HistoryM (ScpM (Deeds, Out FVedTerm))
 sc = memo sc' . gc -- Garbage collection necessary because normalisation might 
have made some stuff dead
 
 
 supercompile :: M.Map Var Term -> Term -> Term
-supercompile unfoldings e = fVedTermToTerm $ snd $ runMemoM $ runHistoryT $ 
runScpM sc $ sc state
+supercompile unfoldings e = fVedTermToTerm $ snd $ runHistoryM $ runMemoT $ 
runScpM sc $ sc state
   where state = prepareTerm unfoldings e



_______________________________________________
Cvs-ghc mailing list
Cvs-ghc@haskell.org
http://www.haskell.org/mailman/listinfo/cvs-ghc

Reply via email to