module Nominal.ConcreteNames where
import Data.Char
import Data.List
import Data.Set (Set)
import qualified Data.Set as Set
type NameSuggestion = [String]
default_names :: NameSuggestion
default_names :: NameSuggestion
default_names = [String
"x", String
"y", String
"z", String
"u", String
"v", String
"w", String
"r", String
"s", String
"t", String
"p", String
"q"]
to_subscript :: Char -> Char
to_subscript :: Char -> Char
to_subscript Char
'0' = Char
'₀'
to_subscript Char
'1' = Char
'₁'
to_subscript Char
'2' = Char
'₂'
to_subscript Char
'3' = Char
'₃'
to_subscript Char
'4' = Char
'₄'
to_subscript Char
'5' = Char
'₅'
to_subscript Char
'6' = Char
'₆'
to_subscript Char
'7' = Char
'₇'
to_subscript Char
'8' = Char
'₈'
to_subscript Char
'9' = Char
'₉'
to_subscript Char
c = Char
c
isAlphaOrWild :: Char -> Bool
isAlphaOrWild :: Char -> Bool
isAlphaOrWild Char
c = Char -> Bool
isAlpha Char
c Bool -> Bool -> Bool
|| Char
c Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'_'
expand_default :: NameSuggestion -> [String]
expand_default :: NameSuggestion -> NameSuggestion
expand_default NameSuggestion
xs0 = NameSuggestion
xs1 NameSuggestion -> NameSuggestion -> NameSuggestion
forall a. [a] -> [a] -> [a]
++ NameSuggestion
xs3 NameSuggestion -> NameSuggestion -> NameSuggestion
forall a. [a] -> [a] -> [a]
++ [ String
x String -> String -> String
forall a. [a] -> [a] -> [a]
++ (Char -> Char) -> String -> String
forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
to_subscript (Integer -> String
forall a. Show a => a -> String
show Integer
n) | Integer
n <- [Integer
1..] :: [Integer], String
x <- NameSuggestion
xs3 ]
where
xs1 :: NameSuggestion
xs1 = [ String
x | String
x <- NameSuggestion
xs0, String
x String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= String
"" ]
xs2 :: NameSuggestion
xs2 = [ String
y | String
x <- NameSuggestion
xs0, let y :: String
y = (Char -> Bool) -> String -> String
forall a. (a -> Bool) -> [a] -> [a]
takeWhile Char -> Bool
isAlphaOrWild String
x, String
y String -> String -> Bool
forall a. Eq a => a -> a -> Bool
/= String
"" ]
xs3 :: NameSuggestion
xs3 = if NameSuggestion -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null NameSuggestion
xs2 then NameSuggestion
default_names else NameSuggestion
xs2
data NameGen = NameGen NameSuggestion (NameSuggestion -> [String])
default_namegen :: NameGen
default_namegen :: NameGen
default_namegen = NameSuggestion -> (NameSuggestion -> NameSuggestion) -> NameGen
NameGen NameSuggestion
default_names NameSuggestion -> NameSuggestion
expand_default
rename_fresh :: Set String -> NameGen -> String
rename_fresh :: Set String -> NameGen -> String
rename_fresh Set String
as (NameGen NameSuggestion
ns NameSuggestion -> NameSuggestion
expander) = String
n'
where
n' :: String
n' = NameSuggestion -> String
forall a. HasCallStack => [a] -> a
head [ String
x | String
x <- NameSuggestion -> NameSuggestion
expand_default (NameSuggestion
ns' NameSuggestion -> NameSuggestion -> NameSuggestion
forall a. [a] -> [a] -> [a]
++ NameSuggestion -> NameSuggestion
expander NameSuggestion
ns'), Bool -> Bool
not (String -> Bool
used String
x) ]
ns' :: NameSuggestion
ns' = if NameSuggestion -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null NameSuggestion
ns then NameSuggestion
default_names else NameSuggestion
ns
used :: String -> Bool
used String
x = String
x String -> Set String -> Bool
forall a. Ord a => a -> Set a -> Bool
`Set.member` Set String
as
combine_names :: NameGen -> NameGen -> NameGen
combine_names :: NameGen -> NameGen -> NameGen
combine_names (NameGen NameSuggestion
xs NameSuggestion -> NameSuggestion
ex1) (NameGen NameSuggestion
ys NameSuggestion -> NameSuggestion
ex2) = NameSuggestion -> (NameSuggestion -> NameSuggestion) -> NameGen
NameGen (NameSuggestion
xs NameSuggestion -> NameSuggestion -> NameSuggestion
forall a. [a] -> [a] -> [a]
++ (NameSuggestion
ys NameSuggestion -> NameSuggestion -> NameSuggestion
forall a. Eq a => [a] -> [a] -> [a]
\\ NameSuggestion
xs)) NameSuggestion -> NameSuggestion
ex1