summaryrefslogtreecommitdiff
path: root/src/Language/Tag.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Language/Tag.hs')
-rw-r--r--src/Language/Tag.hs22
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))