{-# LANGUAGE GeneralizedNewtypeDeriving #-} module Patat.Unique ( Unique , UniqueGen , zeroUniqueGen , freshUnique ) where import Data.Hashable (Hashable) -- | Can be used as a unique identifier. newtype Unique = Unique Int deriving (Hashable, Eq, Ord, Show) -- | Used to generate fresh variables. newtype UniqueGen = UniqueGen Int deriving (Show) zeroUniqueGen :: UniqueGen zeroUniqueGen = UniqueGen 0 freshUnique :: UniqueGen -> (Unique, UniqueGen) freshUnique (UniqueGen x) = (Unique x, UniqueGen (x + 1))