X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2FbasicTypes%2FUniqSupply.lhs;h=25a5289d12e113d76cf7d8d3a9d2cd51ccfb3b20;hb=bf1bf9fb07f1607aa66e7490b2df1ac1b62dd2d0;hp=7bd84b3e9de37a51c5a0f084c64d3f531c592ac6;hpb=6c7b41cc2b24f533697a62bf1843507ae043fc97;p=ghc-hetmet.git diff --git a/compiler/basicTypes/UniqSupply.lhs b/compiler/basicTypes/UniqSupply.lhs index 7bd84b3..25a5289 100644 --- a/compiler/basicTypes/UniqSupply.lhs +++ b/compiler/basicTypes/UniqSupply.lhs @@ -4,34 +4,25 @@ % \begin{code} -{-# OPTIONS -w #-} --- The above warning supression flag is a temporary kludge. --- While working on this module you are encouraged to remove it and fix --- any warnings in the module. See --- http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings --- for details - module UniqSupply ( - UniqSupply, -- Abstractly + UniqSupply, -- Abstractly - uniqFromSupply, uniqsFromSupply, -- basic ops + uniqFromSupply, uniqsFromSupply, -- basic ops - UniqSM, -- type: unique supply monad - initUs, initUs_, - lazyThenUs, lazyMapUs, - mapAndUnzipM, - MonadUnique(..), + UniqSM, -- type: unique supply monad + initUs, initUs_, + lazyThenUs, lazyMapUs, + mapAndUnzipM, + MonadUnique(..), - mkSplitUniqSupply, - splitUniqSupply, listSplitUniqSupply, + mkSplitUniqSupply, + splitUniqSupply, listSplitUniqSupply, - -- Deprecated: - getUniqueUs, getUs, returnUs, thenUs, mapUs + -- Deprecated: + getUniqueUs, getUs, returnUs, thenUs, mapUs ) where -#include "HsVersions.h" - import Unique import FastTypes @@ -41,7 +32,7 @@ import Control.Monad.Fix #if __GLASGOW_HASKELL__ >= 607 import GHC.IOBase (unsafeDupableInterleaveIO) #else -import System.IO.Unsafe ( unsafeInterleaveIO ) +import System.IO.Unsafe ( unsafeInterleaveIO ) unsafeDupableInterleaveIO :: IO a -> IO a unsafeDupableInterleaveIO = unsafeInterleaveIO #endif @@ -50,9 +41,9 @@ unsafeDupableInterleaveIO = unsafeInterleaveIO %************************************************************************ -%* * +%* * \subsection{Splittable Unique supply: @UniqSupply@} -%* * +%* * %************************************************************************ A value of type @UniqSupply@ is unique, and it can @@ -62,34 +53,34 @@ which will be distinct from the first and from all others. \begin{code} data UniqSupply - = MkSplitUniqSupply FastInt -- make the Unique with this - UniqSupply UniqSupply - -- when split => these two supplies + = MkSplitUniqSupply FastInt -- make the Unique with this + UniqSupply UniqSupply + -- when split => these two supplies \end{code} \begin{code} mkSplitUniqSupply :: Char -> IO UniqSupply splitUniqSupply :: UniqSupply -> (UniqSupply, UniqSupply) -listSplitUniqSupply :: UniqSupply -> [UniqSupply] -- Infinite +listSplitUniqSupply :: UniqSupply -> [UniqSupply] -- Infinite uniqFromSupply :: UniqSupply -> Unique -uniqsFromSupply :: UniqSupply -> [Unique] -- Infinite +uniqsFromSupply :: UniqSupply -> [Unique] -- Infinite \end{code} \begin{code} mkSplitUniqSupply c = case fastOrd (cUnbox c) `shiftLFastInt` _ILIT(24) of mask -> let - -- here comes THE MAGIC: - - -- This is one of the most hammered bits in the whole compiler - mk_supply - = unsafeDupableInterleaveIO ( - genSymZh >>= \ u_ -> case iUnbox u_ of { u -> ( - mk_supply >>= \ s1 -> - mk_supply >>= \ s2 -> - return (MkSplitUniqSupply (mask `bitOrFastInt` u) s1 s2) - )}) + -- here comes THE MAGIC: + + -- This is one of the most hammered bits in the whole compiler + mk_supply + = unsafeDupableInterleaveIO ( + genSymZh >>= \ u_ -> case iUnbox u_ of { u -> ( + mk_supply >>= \ s1 -> + mk_supply >>= \ s2 -> + return (MkSplitUniqSupply (mask `bitOrFastInt` u) s1 s2) + )}) in mk_supply @@ -105,9 +96,9 @@ uniqsFromSupply (MkSplitUniqSupply n _ s2) = mkUniqueGrimily (iBox n) : uniqsFro \end{code} %************************************************************************ -%* * +%* * \subsubsection[UniqSupply-monad]{@UniqSupply@ monad: @UniqSM@} -%* * +%* * %************************************************************************ \begin{code} @@ -124,8 +115,8 @@ instance Functor UniqSM where instance Applicative UniqSM where pure = returnUs - (USM f) <*> (USM x) = USM $ \us -> case f us of - (ff, us') -> case x us' of + (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 @@ -133,7 +124,7 @@ initUs :: UniqSupply -> UniqSM a -> (a,UniqSupply) initUs init_us m = case unUSM m init_us of { (r,us) -> (r,us) } initUs_ :: UniqSupply -> UniqSM a -> a -initUs_ init_us m = case unUSM m init_us of { (r,us) -> r } +initUs_ init_us m = case unUSM m init_us of { (r, _) -> r } {-# INLINE thenUs #-} {-# INLINE lazyThenUs #-} @@ -148,8 +139,8 @@ instance MonadFix UniqSM where thenUs :: UniqSM a -> (a -> UniqSM b) -> UniqSM b thenUs (USM expr) cont - = USM (\us -> case (expr us) of - (result, us') -> unUSM (cont result) us') + = USM (\us -> case (expr us) of + (result, us') -> unUSM (cont result) us') lazyThenUs :: UniqSM a -> (a -> UniqSM b) -> UniqSM b lazyThenUs (USM expr) cont @@ -162,9 +153,6 @@ thenUs_ (USM expr) (USM cont) returnUs :: a -> UniqSM a returnUs result = USM (\us -> (result, us)) -withUs :: (UniqSupply -> (a, UniqSupply)) -> UniqSM a -withUs f = USM (\us -> f us) -- Ha ha! - getUs :: UniqSM UniqSupply getUs = USM (\us -> splitUniqSupply us) @@ -176,7 +164,7 @@ class Monad m => MonadUnique m where getUniqueM :: m Unique -- | Get an infinite list of new unique identifiers getUniquesM :: m [Unique] - + getUniqueM = liftM uniqFromSupply getUniqueSupplyM getUniquesM = liftM uniqsFromSupply getUniqueSupplyM @@ -187,14 +175,14 @@ instance MonadUnique UniqSM where getUniqueUs :: UniqSM Unique getUniqueUs = USM (\us -> case splitUniqSupply us of - (us1,us2) -> (uniqFromSupply us1, us2)) + (us1,us2) -> (uniqFromSupply us1, us2)) getUniquesUs :: UniqSM [Unique] getUniquesUs = USM (\us -> case splitUniqSupply us of - (us1,us2) -> (uniqsFromSupply us1, us2)) + (us1,us2) -> (uniqsFromSupply us1, us2)) mapUs :: (a -> UniqSM b) -> [a] -> UniqSM [b] -mapUs f [] = returnUs [] +mapUs _ [] = returnUs [] mapUs f (x:xs) = f x `thenUs` \ r -> mapUs f xs `thenUs` \ rs -> @@ -207,7 +195,7 @@ mapUs f (x:xs) {-# -- SPECIALIZE mapAndUnzip3M :: (a -> UniqSM (b,c,d)) -> [a] -> UniqSM ([b],[c],[d]) #-} lazyMapUs :: (a -> UniqSM b) -> [a] -> UniqSM [b] -lazyMapUs f [] = returnUs [] +lazyMapUs _ [] = returnUs [] lazyMapUs f (x:xs) = f x `lazyThenUs` \ r -> lazyMapUs f xs `lazyThenUs` \ rs ->