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