module Data.Ref where
import Data.Unique
import System.IO.Unsafe
import Control.Applicative
--------------------------------------------------------------------------------
-- * References
--------------------------------------------------------------------------------
data Ref a = Ref { refNr :: Unique , deref :: a }
instance Eq (Ref a) where
Ref u1 _ == Ref u2 _ = u1 == u2
instance Show a => Show (Ref a) where
show (Ref u x) = "(Ref " ++ show (hashUnique u) ++ " " ++ show x ++ ")"
ref :: a -> Ref a
ref x = unsafePerformIO $ flip Ref x <$> newUnique
{-# NOINLINE ref #-}
--------------------------------------------------------------------------------
-- the end.