X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2FbasicTypes%2FUniqSupply.lhs;h=7bd84b3e9de37a51c5a0f084c64d3f531c592ac6;hb=1967fd3474913f3c0dc72b070019a830223c7fab;hp=29d5b17c87f55c024d3b9b523f671b688c6f74af;hpb=a594f2fe4a1f7fa6805fb3aa79a1b7617b343a33;p=ghc-hetmet.git diff --git a/compiler/basicTypes/UniqSupply.lhs b/compiler/basicTypes/UniqSupply.lhs index 29d5b17..7bd84b3 100644 --- a/compiler/basicTypes/UniqSupply.lhs +++ b/compiler/basicTypes/UniqSupply.lhs @@ -18,16 +18,16 @@ module UniqSupply ( uniqFromSupply, uniqsFromSupply, -- basic ops UniqSM, -- type: unique supply monad - initUs, initUs_, thenUs, thenUs_, returnUs, fixUs, getUs, withUs, - getUniqueUs, getUniquesUs, - mapUs, mapAndUnzipUs, mapAndUnzip3Us, - thenMaybeUs, mapAccumLUs, + initUs, initUs_, lazyThenUs, lazyMapUs, - module MonadUtils, mapAndUnzipM, + mapAndUnzipM, MonadUnique(..), mkSplitUniqSupply, - splitUniqSupply, listSplitUniqSupply + splitUniqSupply, listSplitUniqSupply, + + -- Deprecated: + getUniqueUs, getUs, returnUs, thenUs, mapUs ) where #include "HsVersions.h" @@ -35,6 +35,9 @@ module UniqSupply ( import Unique import FastTypes +import MonadUtils +import Control.Monad +import Control.Monad.Fix #if __GLASGOW_HASKELL__ >= 607 import GHC.IOBase (unsafeDupableInterleaveIO) #else @@ -115,6 +118,16 @@ instance Monad UniqSM where (>>=) = thenUs (>>) = thenUs_ +instance Functor UniqSM where + fmap f (USM x) = USM (\us -> case x us of + (r, us') -> (f r, us')) + +instance Applicative UniqSM where + pure = returnUs + (USM f) <*> (USM x) = USM $ \us -> case f us of + (ff, us') -> case x us' of + (xx, us'') -> (ff xx, us'') + -- the initUs function also returns the final UniqSupply; initUs_ drops it initUs :: UniqSupply -> UniqSM a -> (a,UniqSupply) initUs init_us m = case unUSM m init_us of { (r,us) -> (r,us) } @@ -130,8 +143,8 @@ initUs_ init_us m = case unUSM m init_us of { (r,us) -> r } @thenUs@ is where we split the @UniqSupply@. \begin{code} -fixUs :: (a -> UniqSM a) -> UniqSM a -fixUs m = USM (\us -> let (r,us') = unUSM (m r) us in (r,us')) +instance MonadFix UniqSM where + mfix m = USM (\us -> let (r,us') = unUSM (m r) us in (r,us')) thenUs :: UniqSM a -> (a -> UniqSM b) -> UniqSM b thenUs (USM expr) cont @@ -146,7 +159,6 @@ thenUs_ :: UniqSM a -> UniqSM b -> UniqSM b thenUs_ (USM expr) (USM cont) = USM (\us -> case (expr us) of { (_, us') -> cont us' }) - returnUs :: a -> UniqSM a returnUs result = USM (\us -> (result, us)) @@ -180,15 +192,19 @@ getUniqueUs = USM (\us -> case splitUniqSupply us of getUniquesUs :: UniqSM [Unique] getUniquesUs = USM (\us -> case splitUniqSupply us of (us1,us2) -> (uniqsFromSupply us1, us2)) -\end{code} -\begin{code} mapUs :: (a -> UniqSM b) -> [a] -> UniqSM [b] mapUs f [] = returnUs [] mapUs f (x:xs) = f x `thenUs` \ r -> mapUs f xs `thenUs` \ rs -> returnUs (r:rs) +\end{code} + +\begin{code} +{-# -- SPECIALIZE mapM :: (a -> UniqSM b) -> [a] -> UniqSM [b] #-} +{-# -- SPECIALIZE mapAndUnzipM :: (a -> UniqSM (b,c)) -> [a] -> UniqSM ([b],[c]) #-} +{-# -- SPECIALIZE mapAndUnzip3M :: (a -> UniqSM (b,c,d)) -> [a] -> UniqSM ([b],[c],[d]) #-} lazyMapUs :: (a -> UniqSM b) -> [a] -> UniqSM [b] lazyMapUs f [] = returnUs [] @@ -196,37 +212,4 @@ lazyMapUs f (x:xs) = f x `lazyThenUs` \ r -> lazyMapUs f xs `lazyThenUs` \ rs -> returnUs (r:rs) - -mapAndUnzipUs :: (a -> UniqSM (b,c)) -> [a] -> UniqSM ([b],[c]) -mapAndUnzip3Us :: (a -> UniqSM (b,c,d)) -> [a] -> UniqSM ([b],[c],[d]) - -mapAndUnzipUs f [] = returnUs ([],[]) -mapAndUnzipUs f (x:xs) - = f x `thenUs` \ (r1, r2) -> - mapAndUnzipUs f xs `thenUs` \ (rs1, rs2) -> - returnUs (r1:rs1, r2:rs2) - -mapAndUnzip3Us f [] = returnUs ([],[],[]) -mapAndUnzip3Us f (x:xs) - = f x `thenUs` \ (r1, r2, r3) -> - mapAndUnzip3Us f xs `thenUs` \ (rs1, rs2, rs3) -> - returnUs (r1:rs1, r2:rs2, r3:rs3) - -thenMaybeUs :: UniqSM (Maybe a) -> (a -> UniqSM (Maybe b)) -> UniqSM (Maybe b) -thenMaybeUs m k - = m `thenUs` \ result -> - case result of - Nothing -> returnUs Nothing - Just x -> k x - -mapAccumLUs :: (acc -> x -> UniqSM (acc, y)) - -> acc - -> [x] - -> UniqSM (acc, [y]) - -mapAccumLUs f b [] = returnUs (b, []) -mapAccumLUs f b (x:xs) - = f b x `thenUs` \ (b__2, x__2) -> - mapAccumLUs f b__2 xs `thenUs` \ (b__3, xs__2) -> - returnUs (b__3, x__2:xs__2) \end{code}