{-# 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))