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

On branch  : 

http://hackage.haskell.org/trac/ghc/changeset/9775401176aba21fa93e0688780ea8ac337333df

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

commit 9775401176aba21fa93e0688780ea8ac337333df
Author: Max Bolingbroke <batterseapo...@hotmail.com>
Date:   Wed Oct 26 14:59:39 2011 +0100

    Use a functor type parameter to DelayStructure rather than a GADT index

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

 .../supercompile/Supercompile/Drive/Process2.hs    |   47 ++++++++++++-------
 compiler/supercompile/Supercompile/Utilities.hs    |    6 ++-
 2 files changed, 35 insertions(+), 18 deletions(-)

diff --git a/compiler/supercompile/Supercompile/Drive/Process2.hs 
b/compiler/supercompile/Supercompile/Drive/Process2.hs
index a69767f..a023dd1 100644
--- a/compiler/supercompile/Supercompile/Drive/Process2.hs
+++ b/compiler/supercompile/Supercompile/Drive/Process2.hs
@@ -67,18 +67,19 @@ listToStream (x:xs) = x :< listToStream xs
 
 
 data LeafTy a
-data Q
-data A
 
-data DelayStructure sh m qa where
-    LeafQ :: m (DelayM m a) -> DelayStructure (LeafTy a) m Q
-    LeafA :: a              -> DelayStructure (LeafTy a) m A
-    Branch :: DelayStructure sh1 m qa -> DelayStructure sh2 m qa -> 
DelayStructure (sh1, sh2) m qa
+data DelayStructure sh f where
+    Leaf   :: f a -> DelayStructure (LeafTy a) f
+    Branch :: DelayStructure sh1 f -> DelayStructure sh2 f -> DelayStructure 
(sh1, sh2) f
+
+
+--newtype I a = I { unI :: a }
+newtype QM m a = QM { unQM :: m (DelayM m a) }
 
 -- If you don't want DelayM to have Monad structure, you can nuke the nested 
use of DelayM,
 -- and make some of the consumers simpler. I actually want this 
generalisation, though.
 data DelayM m r = Done r
-                | forall sh. Delayed (DelayStructure sh m Q) (DelayStructure 
sh m A -> DelayM m r)
+                | forall sh. Delayed (DelayStructure sh (QM m)) 
(DelayStructure sh Identity -> DelayM m r)
 
 instance Functor (DelayM m) where
     fmap f x = pure f <*> x
@@ -96,7 +97,7 @@ instance Monad (DelayM m) where
     Delayed qs k >>= fxmy = Delayed qs (\as -> k as >>= fxmy)
 
 delay :: m (DelayM m a) -> DelayM m a
-delay q = Delayed (LeafQ q) (\(LeafA a) -> pure a)
+delay q = Delayed (Leaf (QM q)) (\(Leaf (I a)) -> pure a)
 
 runDelayM :: (Applicative m, Monad m)
           => (DelayM m r -> DelayM m r) -- ^ Chooses the evaluation strategy
@@ -108,24 +109,36 @@ runDelayM choose_some = go
     go' (Done x)       = pure x
     go' (Delayed qs k) = mungeDS qs >>= \mx -> go (mx >>= k)
 
+fmapNT :: Applicative m
+       => (forall a. f a -> m (g a))
+       -> DelayStructure sh f
+       -> m (DelayStructure sh g)
+fmapNT f (Leaf x)         = fmap Leaf (f x)
+fmapNT f (Branch qs1 qs2) = liftA2 Branch (fmapNT f qs1) (fmapNT f qs2)
+
 mungeDS :: Applicative n
-        => DelayStructure sh n Q
-        -> n (DelayM n (DelayStructure sh m A))
-mungeDS (LeafQ mx)       = fmap (fmap LeafA) mx
+        => DelayStructure sh (QM n)
+        -> n (DelayM n (DelayStructure sh Identity))
+mungeDS = unComp . fmapNT (Comp . fmap (fmap I) . unQM)
+{-
+mungeDS (Leaf (QM mx))   = fmap (fmap (Leaf . I)) mx
 mungeDS (Branch qs1 qs2) = liftA2 (liftA2 Branch) (mungeDS qs1) (mungeDS qs2)
+-}
 
-delayDS :: DelayStructure sh n Q
-        -> DelayM n (DelayStructure sh m A)
-delayDS (LeafQ mx)       = fmap LeafA (delay mx)
+delayDS :: DelayStructure sh (QM n)
+        -> DelayM n (DelayStructure sh Identity)
+delayDS = fmapNT (fmap I . delay . unQM)
+{-
+delayDS (Leaf (QM mx))   = fmap (Leaf . I) (delay mx)
 delayDS (Branch qs1 qs2) = liftA2 Branch (delayDS qs1) (delayDS qs2)
-
+-}
 
 depthFirst :: DelayM m r -> DelayM m r
 depthFirst (Done x)       = Done x
 depthFirst (Delayed qs k) = delayTail qs >>= k
   where
-    delayTail :: DelayStructure sh m Q -> DelayM m (DelayStructure sh m A)
-    delayTail (LeafQ q)        = fmap LeafA (delay q)
+    delayTail :: DelayStructure sh (QM m) -> DelayM m (DelayStructure sh 
Identity)
+    delayTail (Leaf (QM q))    = fmap (Leaf . I) (delay q)
     delayTail (Branch qs1 qs2) = liftM2 Branch (delayTail qs1) (delayDS qs2)
 
 breadthFirst :: DelayM m r -> DelayM m r
diff --git a/compiler/supercompile/Supercompile/Utilities.hs 
b/compiler/supercompile/Supercompile/Utilities.hs
index c3c77e6..4dd57fb 100644
--- a/compiler/supercompile/Supercompile/Utilities.hs
+++ b/compiler/supercompile/Supercompile/Utilities.hs
@@ -25,7 +25,7 @@ import Outputable
 import State hiding (mapAccumLM)
 
 import Control.Arrow (first, second, (***), (&&&))
-import Control.Applicative (Applicative(..), (<$>))
+import Control.Applicative (Applicative(..), (<$>), liftA2)
 import Control.Exception (bracket)
 import Control.Monad hiding (join)
 
@@ -230,6 +230,10 @@ instance (Functor f, Outputable1 f, Outputable1 g, 
Outputable a) => Outputable (
 instance (Functor f, Functor g) => Functor (O f g) where
     fmap f (Comp x) = Comp (fmap (fmap f) x)
 
+instance (Applicative f, Applicative g) => Applicative (O f g) where
+    pure = Comp . pure . pure
+    mf <*> mx = Comp $ liftA2 (<*>) (unComp mf) (unComp mx)
+
 instance (Foldable f, Foldable g) => Foldable (O f g) where
     foldMap f = foldMap (foldMap f) . unComp
 



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

Reply via email to