renamePrettily
This commit is contained in:
@@ -285,5 +285,40 @@ programDefs k (Program ds) = Program <$> go k ds where
|
|||||||
|
|
||||||
--------------------------------------------------------------------------------
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
renamePrettily a = id
|
renamePrettily' :: Type PsName -> Type PsName
|
||||||
|
renamePrettily' = join renamePrettily
|
||||||
|
|
||||||
|
-- | for some type, compute a substitution which will rename all free variables
|
||||||
|
-- for aesthetic purposes
|
||||||
|
|
||||||
|
renamePrettily :: Type PsName -> Type PsName -> Type PsName
|
||||||
|
renamePrettily root = (`evalState` alphabetNames) . (renameFree <=< renameBound)
|
||||||
|
where
|
||||||
|
renameBound :: Type PsName -> State [PsName] (Type PsName)
|
||||||
|
renameBound = cata \case
|
||||||
|
ForallTF x m -> do
|
||||||
|
n <- getName
|
||||||
|
ForallT n <$> (subst x (VarT n) <$> m)
|
||||||
|
t -> embed <$> sequenceA t
|
||||||
|
|
||||||
|
renameFree :: Type PsName -> State [PsName] (Type PsName)
|
||||||
|
renameFree t = do
|
||||||
|
subs <- forM (freeVariablesLTR root) $ \v -> do
|
||||||
|
n <- getName
|
||||||
|
pure $ Endo (subst v (VarT n))
|
||||||
|
pure . appEndo (fold subs) $ t
|
||||||
|
|
||||||
|
getName :: State [PsName] PsName
|
||||||
|
getName = state (fromJust . uncons)
|
||||||
|
|
||||||
|
alphabetNames :: [PsName]
|
||||||
|
alphabetNames = alphabet ++ concatMap appendAlphabet alphabetNames
|
||||||
|
where alphabet = [ T.pack [c] | c <- ['a'..'z'] ]
|
||||||
|
appendAlphabet c = [ c <> c' | c' <- alphabet ]
|
||||||
|
|
||||||
|
freeVariablesLTR :: Type PsName -> [PsName]
|
||||||
|
freeVariablesLTR = nub . cata \case
|
||||||
|
VarTF x -> [x]
|
||||||
|
ForallTF x m -> m \\ [x]
|
||||||
|
vs -> concat vs
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user