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 (T ident -> T ident -> Bool
(T ident -> T ident -> Bool)
-> (T ident -> T ident -> Bool) -> Eq (T ident)
forall ident. T ident -> T ident -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall ident. T ident -> T ident -> Bool
== :: T ident -> T ident -> Bool
$c/= :: forall ident. T ident -> T ident -> Bool
/= :: T ident -> T ident -> Bool
Eq, Eq (T ident)
Eq (T ident)
-> (T ident -> T ident -> Ordering)
-> (T ident -> T ident -> Bool)
-> (T ident -> T ident -> Bool)
-> (T ident -> T ident -> Bool)
-> (T ident -> T ident -> Bool)
-> (T ident -> T ident -> T ident)
-> (T ident -> T ident -> T ident)
-> Ord (T ident)
T ident -> T ident -> Bool
T ident -> T ident -> Ordering
T ident -> T ident -> T ident
forall ident. Eq (T ident)
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall ident. T ident -> T ident -> Bool
forall ident. T ident -> T ident -> Ordering
forall ident. T ident -> T ident -> T ident
$ccompare :: forall ident. T ident -> T ident -> Ordering
compare :: T ident -> T ident -> Ordering
$c< :: forall ident. T ident -> T ident -> Bool
< :: T ident -> T ident -> Bool
$c<= :: forall ident. T ident -> T ident -> Bool
<= :: T ident -> T ident -> Bool
$c> :: forall ident. T ident -> T ident -> Bool
> :: T ident -> T ident -> Bool
$c>= :: forall ident. T ident -> T ident -> Bool
>= :: T ident -> T ident -> Bool
$cmax :: forall ident. T ident -> T ident -> T ident
max :: T ident -> T ident -> T ident
$cmin :: forall ident. T ident -> T ident -> T ident
min :: T ident -> T ident -> T ident
Ord)

instance Enum (T ident) where
   fromEnum :: T ident -> Int
fromEnum (Cons Int
n) = Int
n
   toEnum :: Int -> T ident
toEnum Int
n = (Int -> T ident
forall ident. Int -> T ident
Cons Int
n)

format :: Int -> T ident -> String
format :: forall ident. Int -> T ident -> String
format Int
pad (Cons Int
n) = Char -> Int -> String -> String
forall a. a -> Int -> [a] -> [a]
ListHT.padLeft Char
'0' Int
pad (Int -> String
forall a. Show a => a -> String
show Int
n)

new :: IO (IORef.IORef (T ident))
new :: forall ident. IO (IORef (T ident))
new = T ident -> IO (IORef (T ident))
forall a. a -> IO (IORef a)
IORef.newIORef (Int -> T ident
forall ident. Int -> T ident
Cons Int
0)

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