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