unique identifiers as a separate library

Simon Marlow marlowsd at gmail.com
Fri Dec 19 04:24:58 EST 2008

ajb at spamcop.net wrote:
> G'day all.
> Quoting Sebastian Fischer <sebf at informatik.uni-kiel.de>:
>> I have wrapped up (a tiny subset of) GHC's uniques into the package
>> `uniqueid` and put it on Hackage:
>>     http://hackage.haskell.org/cgi-bin/hackage-scripts/package/uniqueid
> First off, thanks for this.
>> The main difference is due to my fear of depending on the foreign
>> function `genSymZh` which I replaced by a global counting IORef.
> Why not depend on this instead?
> http://hackage.haskell.org/cgi-bin/hackage-scripts/package/value-supply

Looking at the code for this, I'm somewhat suspicious that it actually 
works with GHC:

   -- The extra argument to ``gen'' is passed because without
   -- it Hugs spots that the recursive calls are the same but does
   -- not know that unsafePerformIO is unsafe.
   where gen _ r = Node { supplyValue  = unsafePerformIO (genSym r),
                          supplyLeft   = gen False r,
                          supplyRight  = gen True r }

even if that extra Bool argument is enough to fool Hugs, I wouldn't count 
on it being enough to fool GHC -O2!  You probably want to use 
unsafeInterleaveIO like we do in GHC's UniqSupply library.

Also, I'd replace the MVar with an IORef and use atomicModifyIORef for speed.


More information about the Glasgow-haskell-users mailing list