module LLVM.DSL.Debug.Counter where

import qualified Data.IORef as IORef
import qualified Data.List.HT as ListHT


newtype T ident = Cons Int
   deriving (Eq, Ord)

instance Enum (T ident) where
   fromEnum (Cons n) = n
   toEnum n = (Cons n)

format :: Int -> T ident -> String
format pad (Cons n) = ListHT.padLeft '0' pad (show n)

new :: IO (IORef.IORef (T ident))
new = IORef.newIORef (Cons 0)

next :: IORef.IORef (T ident) -> IO (T ident)
next cnt = do
   a <- IORef.readIORef cnt
   IORef.modifyIORef cnt succ
   return a