@@ -197,15 +197,16 @@ instance (Pretty a, Pretty b) => Pretty (Scheme a b) where
197 dict = P.parens . P.sep . P.punctuate P.comma . map prettyPair $ Map.toList headers
197 dict = P.parens . P.sep . P.punctuate P.comma . map prettyPair $ Map.toList headers
198 prettyPair (n,t) = P.text n <+> P.text ":" <+> pretty t
198 prettyPair (n,t) = P.text n <+> P.text ":" <+> pretty t
200−
200+extraPretty :: (Pretty t, Crawl t) => t -> IO Doc
201−prettyNames constraint = do
201+extraPretty value = do
202− (_, rawVars) <- fold constraint [] getNames
202+ (_, rawVars) <- runStateT (crawl getNames value) []
203 let vars = map head . List.group $ List.sort rawVars
203 let vars = map head . List.group $ List.sort rawVars
204 letters = map (:[]) ['a'..'z']
204 letters = map (:[]) ['a'..'z']
205 suffix s = map (++s)
205 suffix s = map (++s)
206 allVars = letters ++ suffix "'" letters ++ concatMap (\n -> suffix (show n) letters) [0..]
206 allVars = letters ++ suffix "'" letters ++ concatMap (\n -> suffix (show n) letters) [0..]
207 okayVars = filter (`notElem` vars) allVars
207 okayVars = filter (`notElem` vars) allVars
208− fold constraint okayVars rename
208+ runStateT (crawl rename value) okayVars
209+ return (pretty value)
210 getNames name vars =
211 getNames name vars =
211 case name of
212 case name of
@@ -217,39 +218,60 @@ prettyNames constraint = do
217 Just var -> (name, vars)
218 Just var -> (name, vars)
218 Nothing -> (Just (head vars), tail vars)
219 Nothing -> (Just (head vars), tail vars)
220−fold constraint initialState func =
221+
221− runStateT (prettyName constraint) initialState
222+-- Code for traversing all the type data-structures and giving
222− where
223+-- names to the variables embedded deep in there.
223− prettyName constraint =
224+class Crawl t where
225+ crawl :: (Maybe TypeName -> [String] -> (Maybe TypeName, [String]))
227+ -> StateT [String] IO t
229+instance (Crawl t, Crawl v) => Crawl (Constraint t v) where
230+ crawl nextState constraint =
231+ let rnm = crawl nextState in
224− case constraint of
232+ case constraint of
225− CTrue -> return CTrue
233+ CTrue -> return CTrue
226− CEqual a b -> CEqual <$> prettyTypeName a <*> prettyTypeName b
234+ CEqual a b -> CEqual <$> rnm a <*> rnm b
227− CAnd cs -> CAnd <$> mapM prettyName cs
235+ CAnd cs -> CAnd <$> crawl nextState cs
228− CLet schemes c -> CLet <$> mapM prettySchemeName schemes <*> prettyName c
236+ CLet schemes c -> CLet <$> crawl nextState schemes <*> crawl nextState c
229− CInstance name tipe -> CInstance name <$> prettyTypeName tipe
237+ CInstance name tipe -> CInstance name <$> rnm tipe
231− prettySchemeName (Scheme rqs fqs c headers) =
239+instance Crawl a => Crawl [a] where
232− Scheme <$> mapM prettyVarName rqs <*> mapM prettyVarName fqs <*> prettyName c <*> return headers
240+ crawl nextState list = mapM (crawl nextState) list
234− prettyVarName point = do
242+instance (Crawl t, Crawl v) => Crawl (Scheme t v) where
235− state <- get
243+ crawl nextState (Scheme rqs fqs c headers) =
244+ let rnm = crawl nextState in
245+ Scheme <$> rnm rqs <*> rnm fqs <*> crawl nextState c <*> return headers
247+instance Crawl t => Crawl (TermN t) where
248+ crawl nextState tipe =
250+ VarN x -> VarN <$> crawl nextState x
251+ TermN term -> TermN <$> crawl nextState term
253+instance Crawl t => Crawl (Term1 t) where
254+ crawl nextState term =
255+ let rnm = crawl nextState in
257+ App1 a b -> App1 <$> rnm a <*> rnm b
258+ Fun1 a b -> Fun1 <$> rnm a <*> rnm b
259+ Var1 a -> Var1 <$> rnm a
260+ EmptyRecord1 -> return EmptyRecord1
261+ Record1 fields ext ->
262+ Record1 <$> traverse (mapM rnm) fields <*> rnm ext
264+instance Crawl a => Crawl (UF.Point a) where
265+ crawl nextState point = do
236− put =<< do desc <- liftIO $ UF.descriptor point
266+ desc <- liftIO $ UF.descriptor point
237− let (name', state') = func (name desc) state
267+ desc' <- crawl nextState desc
238− liftIO $ UF.setDescriptor point (desc { name = name' })
268+ liftIO $ UF.setDescriptor point desc'
239− return state'
269+ return point
241−
271+instance Crawl Descriptor where
242− prettyTypeName tipe =
272+ crawl nextState desc = do
243− case tipe of
273+ state <- get
244− VarN x -> VarN <$> prettyVarName x
274+ let (name', state') = nextState (name desc) state
245− TermN term -> TermN <$> prettyTermName term
275+ structure' <- traverse (crawl nextState) (structure desc)
247− prettyTermName term =
277+ return $ desc { name = name', structure = structure' }
249− App1 a b -> App1 <$> prettyTypeName a <*> prettyTypeName b
250− Fun1 a b -> Fun1 <$> prettyTypeName a <*> prettyTypeName b
251− Var1 a -> Var1 <$> prettyTypeName a
252− EmptyRecord1 -> return EmptyRecord1
253− Record1 fields ext -> Record1 <$> fields' <*> prettyTypeName ext
255− fields' = traverse (mapM prettyTypeName) fields