diff options
Diffstat (limited to 'src/Language/Tag.hs')
-rw-r--r-- | src/Language/Tag.hs | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/src/Language/Tag.hs b/src/Language/Tag.hs new file mode 100644 index 0000000..9356073 --- /dev/null +++ b/src/Language/Tag.hs @@ -0,0 +1,22 @@ +{-# LANGUAGE BangPatterns #-} +module Language.Tag ( + Tag(..), genTag, +) where + +import Data.IORef +import System.IO.Unsafe + +import AST + + +data Tag t = Tag (STy t) Int + deriving (Show) + +{-# NOINLINE tagCounter #-} +tagCounter :: IORef Int +tagCounter = unsafePerformIO $ newIORef 1 + +{-# NOINLINE genTag #-} +genTag :: handle -> STy t -> Tag t +genTag !_ ty = + unsafePerformIO $ Tag ty <$> atomicModifyIORef' tagCounter (\i -> (succ i, i)) |