X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2FbasicTypes%2FUniqSupply.lhs;h=13175fb3b31151be54119bd31d7c7ee8fa469971;hb=495ef8bd9ef30bffe50ea399b91e3ba09646b59a;hp=1c651cb62b1a268d7b7f9ebf0d095469accff422;hpb=003a62090be4ad204165cc09f7950fdde089b956;p=ghc-hetmet.git diff --git a/ghc/compiler/basicTypes/UniqSupply.lhs b/ghc/compiler/basicTypes/UniqSupply.lhs index 1c651cb..13175fb 100644 --- a/ghc/compiler/basicTypes/UniqSupply.lhs +++ b/ghc/compiler/basicTypes/UniqSupply.lhs @@ -1,19 +1,18 @@ % -% (c) The GRASP/AQUA Project, Glasgow University, 1992-1996 +% (c) The GRASP/AQUA Project, Glasgow University, 1992-1998 % \section[UniqSupply]{The @UniqueSupply@ data type and a (monadic) supply thereof} \begin{code} -#include "HsVersions.h" - module UniqSupply ( UniqSupply, -- Abstractly - getUnique, getUniques, -- basic ops + uniqFromSupply, uniqsFromSupply, -- basic ops - SYN_IE(UniqSM), -- type: unique supply monad - initUs, thenUs, returnUs, fixUs, + UniqSM, -- type: unique supply monad + initUs, initUs_, thenUs, thenUs_, returnUs, fixUs, getUs, setUs, + getUniqueUs, getUniquesUs, mapUs, mapAndUnzipUs, mapAndUnzip3Us, thenMaybeUs, mapAccumLUs, @@ -21,29 +20,16 @@ module UniqSupply ( splitUniqSupply ) where -IMP_Ubiq(){-uitous-} +#include "HsVersions.h" import Unique -import Util +import Panic ( panic ) - -#if __GLASGOW_HASKELL__ == 201 -import PreludeGlaST -# define WHASH GHCbase.W# -#elif __GLASGOW_HASKELL__ >= 202 import GlaExts -import STBase -# if __GLASGOW_HASKELL__ == 202 -import PrelBase ( Char(..) ) -# endif -# define WHASH GlaExts.W# -#else -import PreludeGlaST -# define WHASH W# -#endif -#if __GLASGOW_HASKELL__ >= 209 -import Unsafe ( unsafeInterleaveIO ) +#if __GLASGOW_HASKELL__ < 301 +import IOBase ( IO(..), IOResult(..) ) +#else #endif w2i x = word2Int# x @@ -80,8 +66,8 @@ data UniqSupply mkSplitUniqSupply :: Char -> IO UniqSupply splitUniqSupply :: UniqSupply -> (UniqSupply, UniqSupply) -getUnique :: UniqSupply -> Unique -getUniques :: Int -> UniqSupply -> [Unique] +uniqFromSupply :: UniqSupply -> Unique +uniqsFromSupply :: Int -> UniqSupply -> [Unique] \end{code} \begin{code} @@ -91,49 +77,27 @@ mkSplitUniqSupply (C# c#) -- here comes THE MAGIC: + -- This is one of the most hammered bits in the whole compiler mk_supply# - = unsafe_interleave ( - mk_unique `thenPrimIO` \ uniq -> - mk_supply# `thenPrimIO` \ s1 -> - mk_supply# `thenPrimIO` \ s2 -> - returnPrimIO (MkSplitUniqSupply uniq s1 s2) + = unsafeInterleaveIO ( + mk_unique >>= \ uniq -> + mk_supply# >>= \ s1 -> + mk_supply# >>= \ s2 -> + return (MkSplitUniqSupply uniq s1 s2) ) - where --- - -- inlined copy of unsafeInterleavePrimIO; - -- this is the single-most-hammered bit of code - -- in the compiler.... - -- Too bad it's not 1.3-portable... - unsafe_interleave m = -#if __GLASGOW_HASKELL__ >= 209 - unsafeInterleaveIO m -#else - MkST ( \ s -> - let - (MkST m') = m - ST_RET(r, new_s) = m' s - in - ST_RET(r, s)) -#endif - mk_unique = _ccall_ genSymZh `thenPrimIO` \ (WHASH u#) -> - returnPrimIO (I# (w2i (mask# `or#` u#))) + mk_unique = _ccall_ genSymZh >>= \ (W# u#) -> + return (I# (w2i (mask# `or#` u#))) in -#if __GLASGOW_HASKELL__ >= 200 - primIOToIO mk_supply# >>= \ s -> - return s -#else - mk_supply# `thenPrimIO` \ s -> - return s -#endif + mk_supply# splitUniqSupply (MkSplitUniqSupply _ s1 s2) = (s1, s2) \end{code} \begin{code} -getUnique (MkSplitUniqSupply (I# n) _ _) = mkUniqueGrimily n +uniqFromSupply (MkSplitUniqSupply (I# n) _ _) = mkUniqueGrimily n -getUniques (I# i) supply = i `get_from` supply +uniqsFromSupply (I# i) supply = i `get_from` supply where get_from 0# _ = [] get_from n (MkSplitUniqSupply (I# u) _ s2) @@ -147,13 +111,14 @@ getUniques (I# i) supply = i `get_from` supply %************************************************************************ \begin{code} -type UniqSM result = UniqSupply -> result +type UniqSM result = UniqSupply -> (result, UniqSupply) --- the initUs function also returns the final UniqSupply +-- 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 :: UniqSupply -> UniqSM a -> a - -initUs init_us m = m init_us +initUs_ :: UniqSupply -> UniqSM a -> a +initUs_ init_us m = case m init_us of { (r,us) -> r } {-# INLINE thenUs #-} {-# INLINE returnUs #-} @@ -164,20 +129,35 @@ initUs init_us m = m init_us \begin{code} fixUs :: (a -> UniqSM a) -> UniqSM a fixUs m us - = r where r = m r us + = (r,us') where (r,us') = m r us thenUs :: UniqSM a -> (a -> UniqSM b) -> UniqSM b - thenUs expr cont us - = case (splitUniqSupply us) of { (s1, s2) -> - case (expr s1) of { result -> - cont result s2 }} -\end{code} + = case (expr us) of { (result, us') -> cont result us' } + +thenUs_ :: UniqSM a -> UniqSM b -> UniqSM b +thenUs_ expr cont us + = case (expr us) of { (_, us') -> cont us' } -\begin{code} returnUs :: a -> UniqSM a -returnUs result us = result +returnUs result us = (result, us) + +getUs :: UniqSM UniqSupply +getUs us = (us, panic "getUs: bad supply") +setUs :: UniqSupply -> UniqSM () +setUs us old_us = ((), 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) +\end{code} + +\begin{code} mapUs :: (a -> UniqSM b) -> [a] -> UniqSM [b] mapUs f [] = returnUs []