X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2FbasicTypes%2FUniqSupply.lhs;h=05b565fe2e423d538fd730241261d35485edcaf2;hb=a97f155c04a7ff981da3e589158ecf70db72d1cd;hp=41ad5c0f60dadb5846cfe77716e77673443ab0e6;hpb=0065d5ab628975892cea1ec7303f968c3338cbe1;p=ghc-hetmet.git diff --git a/compiler/basicTypes/UniqSupply.lhs b/compiler/basicTypes/UniqSupply.lhs index 41ad5c0..05b565f 100644 --- a/compiler/basicTypes/UniqSupply.lhs +++ b/compiler/basicTypes/UniqSupply.lhs @@ -47,7 +47,7 @@ which will be distinct from the first and from all others. \begin{code} data UniqSupply - = MkSplitUniqSupply Int -- make the Unique with this + = MkSplitUniqSupply Int# -- make the Unique with this UniqSupply UniqSupply -- when split => these two supplies \end{code} @@ -73,14 +73,11 @@ mkSplitUniqSupply (C# c#) -- This is one of the most hammered bits in the whole compiler mk_supply# = unsafeInterleaveIO ( - mk_unique >>= \ uniq -> + genSymZh >>= \ (W# u#) -> mk_supply# >>= \ s1 -> mk_supply# >>= \ s2 -> - return (MkSplitUniqSupply uniq s1 s2) + return (MkSplitUniqSupply (w2i (mask# `or#` u#)) s1 s2) ) - - mk_unique = genSymZh >>= \ (W# u#) -> - return (I# (w2i (mask# `or#` u#))) in mk_supply# @@ -90,8 +87,8 @@ splitUniqSupply (MkSplitUniqSupply _ s1 s2) = (s1, s2) \end{code} \begin{code} -uniqFromSupply (MkSplitUniqSupply n _ _) = mkUniqueGrimily n -uniqsFromSupply (MkSplitUniqSupply n _ s2) = mkUniqueGrimily n : uniqsFromSupply s2 +uniqFromSupply (MkSplitUniqSupply n _ _) = mkUniqueGrimily (I# n) +uniqsFromSupply (MkSplitUniqSupply n _ s2) = mkUniqueGrimily (I# n) : uniqsFromSupply s2 \end{code} %************************************************************************ @@ -101,14 +98,19 @@ uniqsFromSupply (MkSplitUniqSupply n _ s2) = mkUniqueGrimily n : uniqsFromSupply %************************************************************************ \begin{code} -type UniqSM result = UniqSupply -> (result, UniqSupply) +newtype UniqSM result = USM { unUSM :: UniqSupply -> (result, UniqSupply) } + +instance Monad UniqSM where + return = returnUs + (>>=) = thenUs + (>>) = thenUs_ -- 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 unUSM m init_us of { (r,us) -> (r,us) } initUs_ :: UniqSupply -> UniqSM a -> a -initUs_ init_us m = case m init_us of { (r,us) -> r } +initUs_ init_us m = case unUSM m init_us of { (r,us) -> r } {-# INLINE thenUs #-} {-# INLINE lazyThenUs #-} @@ -119,38 +121,38 @@ initUs_ init_us m = case m init_us of { (r,us) -> r } @thenUs@ is where we split the @UniqSupply@. \begin{code} fixUs :: (a -> UniqSM a) -> UniqSM a -fixUs m us - = (r,us') where (r,us') = m r us +fixUs m = USM (\us -> let (r,us') = unUSM (m r) us in (r,us')) thenUs :: UniqSM a -> (a -> UniqSM b) -> UniqSM b -thenUs expr cont us - = case (expr us) of { (result, us') -> cont result us' } +thenUs (USM expr) cont + = USM (\us -> case (expr us) of + (result, us') -> unUSM (cont result) us') lazyThenUs :: UniqSM a -> (a -> UniqSM b) -> UniqSM b -lazyThenUs expr cont us - = let (result, us') = expr us in cont result us' +lazyThenUs (USM expr) cont + = USM (\us -> let (result, us') = expr us in unUSM (cont result) us') thenUs_ :: UniqSM a -> UniqSM b -> UniqSM b -thenUs_ expr cont us - = case (expr us) of { (_, us') -> cont us' } +thenUs_ (USM expr) (USM cont) + = USM (\us -> case (expr us) of { (_, us') -> cont us' }) returnUs :: a -> UniqSM a -returnUs result us = (result, us) +returnUs result = USM (\us -> (result, us)) withUs :: (UniqSupply -> (a, UniqSupply)) -> UniqSM a -withUs f us = f us -- Ha ha! +withUs f = USM (\us -> f us) -- Ha ha! getUs :: UniqSM UniqSupply -getUs us = splitUniqSupply us +getUs = USM (\us -> splitUniqSupply us) getUniqueUs :: UniqSM Unique -getUniqueUs us = case splitUniqSupply us of - (us1,us2) -> (uniqFromSupply us1, us2) +getUniqueUs = USM (\us -> case splitUniqSupply us of + (us1,us2) -> (uniqFromSupply us1, us2)) getUniquesUs :: UniqSM [Unique] -getUniquesUs us = case splitUniqSupply us of - (us1,us2) -> (uniqsFromSupply us1, us2) +getUniquesUs = USM (\us -> case splitUniqSupply us of + (us1,us2) -> (uniqsFromSupply us1, us2)) \end{code} \begin{code}