module Nominal.Atom where
import Data.Unique
import Nominal.Unsafe
import Nominal.ConcreteNames
data Atom =
Atom Unique String NameGen
instance Eq Atom where
Atom Unique
x String
n NameGen
ng == :: Atom -> Atom -> Bool
== Atom Unique
x' String
n' NameGen
ng' = Unique
x Unique -> Unique -> Bool
forall a. Eq a => a -> a -> Bool
== Unique
x'
instance Ord Atom where
compare :: Atom -> Atom -> Ordering
compare (Atom Unique
x String
n NameGen
ng) (Atom Unique
x' String
n' NameGen
ng') = Unique -> Unique -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Unique
x Unique
x'
instance Show Atom where
show :: Atom -> String
show = Atom -> String
atom_show
atom_show :: Atom -> String
atom_show :: Atom -> String
atom_show (Atom Unique
x String
n NameGen
ng) = String
n
atom_names :: Atom -> NameGen
atom_names :: Atom -> NameGen
atom_names (Atom Unique
x String
n NameGen
ng) = NameGen
ng
fresh_atom_named :: String -> NameGen -> IO Atom
fresh_atom_named :: String -> NameGen -> IO Atom
fresh_atom_named String
n NameGen
ng = do
Unique
x <- IO Unique
newUnique
Atom -> IO Atom
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Unique -> String -> NameGen -> Atom
Atom Unique
x String
n NameGen
ng)
fresh_atom :: NameGen -> IO Atom
fresh_atom :: NameGen -> IO Atom
fresh_atom NameGen
ng = do
String
n <- NameGen -> IO String
global_new_io NameGen
ng
String -> NameGen -> IO Atom
fresh_atom_named String
n NameGen
ng
with_fresh_atom_named :: String -> NameGen -> (Atom -> a) -> a
with_fresh_atom_named :: forall a. String -> NameGen -> (Atom -> a) -> a
with_fresh_atom_named String
n NameGen
ng Atom -> a
k =
(Unique -> a) -> a
forall a. (Unique -> a) -> a
with_unique (\Unique
x -> Atom -> a
k (Unique -> String -> NameGen -> Atom
Atom Unique
x String
n NameGen
ng))
with_fresh_atom :: NameGen -> (Atom -> a) -> a
with_fresh_atom :: forall a. NameGen -> (Atom -> a) -> a
with_fresh_atom NameGen
ng Atom -> a
k =
String -> NameGen -> (Atom -> a) -> a
forall a. String -> NameGen -> (Atom -> a) -> a
with_fresh_atom_named (NameGen -> String
global_new NameGen
ng) NameGen
ng Atom -> a
k