X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2FbasicTypes%2FUniqSupply.lhs;h=86cf320bf8516007a6c8130a8524b03270e92f4e;hb=983d2d8ef49562b38a30d3ecda740796fcc6d4b0;hp=ba06f24253eed453d67c1e2b92eea0c7519ecc96;hpb=a132bff61cbe15feaed0b69f45a2c8532d636084;p=ghc-hetmet.git diff --git a/ghc/compiler/basicTypes/UniqSupply.lhs b/ghc/compiler/basicTypes/UniqSupply.lhs index ba06f24..86cf320 100644 --- a/ghc/compiler/basicTypes/UniqSupply.lhs +++ b/ghc/compiler/basicTypes/UniqSupply.lhs @@ -11,10 +11,11 @@ module UniqSupply ( uniqFromSupply, uniqsFromSupply, -- basic ops UniqSM, -- type: unique supply monad - initUs, thenUs, thenUs_, returnUs, fixUs, getUs, setUs, + initUs, initUs_, thenUs, thenUs_, returnUs, fixUs, getUs, withUs, getUniqueUs, getUniquesUs, mapUs, mapAndUnzipUs, mapAndUnzip3Us, thenMaybeUs, mapAccumLUs, + lazyThenUs, lazyMapUs, mkSplitUniqSupply, splitUniqSupply @@ -23,14 +24,9 @@ module UniqSupply ( #include "HsVersions.h" import Unique -import Panic ( panic ) -import GlaExts - -#if __GLASGOW_HASKELL__ < 301 -import IOBase ( IO(..), IOResult(..) ) -#else -#endif +import GLAEXTS +import UNSAFE_IO ( unsafeInterleaveIO ) w2i x = word2Int# x i2w x = int2Word# x @@ -44,12 +40,6 @@ i2w_s x = (x :: Int#) %* * %************************************************************************ -%************************************************************************ -%* * -\subsubsection[UniqSupply-type]{@UniqSupply@ type and operations} -%* * -%************************************************************************ - A value of type @UniqSupply@ is unique, and it can supply {\em one} distinct @Unique@. Also, from the supply, one can also manufacture an arbitrary number of further @UniqueSupplies@, @@ -67,14 +57,17 @@ mkSplitUniqSupply :: Char -> IO UniqSupply splitUniqSupply :: UniqSupply -> (UniqSupply, UniqSupply) uniqFromSupply :: UniqSupply -> Unique -uniqsFromSupply :: Int -> UniqSupply -> [Unique] +uniqsFromSupply :: UniqSupply -> [Unique] -- Infinite \end{code} \begin{code} mkSplitUniqSupply (C# c#) = let +#if __GLASGOW_HASKELL__ >= 503 + mask# = (i2w (ord# c#)) `uncheckedShiftL#` (i2w_s 24#) +#else mask# = (i2w (ord# c#)) `shiftL#` (i2w_s 24#) - +#endif -- here comes THE MAGIC: -- This is one of the most hammered bits in the whole compiler @@ -86,7 +79,7 @@ mkSplitUniqSupply (C# c#) return (MkSplitUniqSupply uniq s1 s2) ) - mk_unique = _ccall_ genSymzh >>= \ (W# u#) -> + mk_unique = _ccall_ genSymZh >>= \ (W# u#) -> return (I# (w2i (mask# `or#` u#))) in mk_supply# @@ -95,13 +88,8 @@ splitUniqSupply (MkSplitUniqSupply _ s1 s2) = (s1, s2) \end{code} \begin{code} -uniqFromSupply (MkSplitUniqSupply (I# n) _ _) = mkUniqueGrimily n - -uniqsFromSupply (I# i) supply = i `get_from` supply - where - get_from 0# _ = [] - get_from n (MkSplitUniqSupply (I# u) _ s2) - = mkUniqueGrimily u : get_from (n -# 1#) s2 +uniqFromSupply (MkSplitUniqSupply (I# n) _ _) = mkUniqueGrimily n +uniqsFromSupply (MkSplitUniqSupply (I# n) _ s2) = mkUniqueGrimily n : uniqsFromSupply s2 \end{code} %************************************************************************ @@ -113,13 +101,15 @@ uniqsFromSupply (I# i) supply = i `get_from` supply \begin{code} type UniqSM result = UniqSupply -> (result, UniqSupply) --- the initUs function also returns the final UniqSupply - -initUs :: UniqSupply -> UniqSM a -> a +-- the initUs function also returns the final UniqSupply; initUs_ drops it +initUs :: UniqSupply -> UniqSM a -> (a,UniqSupply) +initUs init_us m = case m init_us of { (r,us) -> (r,us) } -initUs init_us m = case m init_us of { (r,_) -> r } +initUs_ :: UniqSupply -> UniqSM a -> a +initUs_ init_us m = case m init_us of { (r,us) -> r } {-# INLINE thenUs #-} +{-# INLINE lazyThenUs #-} {-# INLINE returnUs #-} {-# INLINE splitUniqSupply #-} \end{code} @@ -134,37 +124,48 @@ thenUs :: UniqSM a -> (a -> UniqSM b) -> UniqSM b thenUs expr cont us = case (expr us) of { (result, us') -> cont result us' } +lazyThenUs :: UniqSM a -> (a -> UniqSM b) -> UniqSM b +lazyThenUs expr cont us + = let (result, us') = expr us in cont result us' + thenUs_ :: UniqSM a -> UniqSM b -> UniqSM b thenUs_ expr cont us = case (expr us) of { (_, us') -> cont us' } + returnUs :: a -> UniqSM a returnUs result us = (result, us) +withUs :: (UniqSupply -> (a, UniqSupply)) -> UniqSM a +withUs f us = f us -- Ha ha! + getUs :: UniqSM UniqSupply -getUs us = (us, panic "getUs: bad supply") - -setUs :: UniqSupply -> UniqSM () -setUs us old_us = ((), us) +getUs us = splitUniqSupply us getUniqueUs :: UniqSM Unique getUniqueUs us = case splitUniqSupply us of (us1,us2) -> (uniqFromSupply us1, us2) -getUniquesUs :: Int -> UniqSM [Unique] -getUniquesUs n us = case splitUniqSupply us of - (us1,us2) -> (uniqsFromSupply n us1, us2) +getUniquesUs :: UniqSM [Unique] +getUniquesUs 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) +lazyMapUs :: (a -> UniqSM b) -> [a] -> UniqSM [b] +lazyMapUs f [] = returnUs [] +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])