module TiPretty where
import TiTypes hiding (forall')
import TiNames
import TiKinds
import PrettyPrint
import SpecialNames
import PrettySymbols(forall',imp,el)
import Syntax(hsTyVar)
import HsDeclPretty(ppFunDeps,ppContext)
import MUtils(( # ),ifM)
instance (TypeId i,ValueId i)
=> Printable (Scheme i) where
ppi (Forall [] [] qt) = ppi qt
ppi (Forall aks vks qt@(_:=>t)) =
ppIfUnicode (ppForall varnames) (ppForall asciinames)
where
ppForall names = sep [forall' <+> vs'' <+> ".",letNest qt'']
where
qt'' = ifM (debugInfo # getPPEnv) (ppi qt) (ppi qt')
vs'' = ifM (debugInfo # getPPEnv) (asep (k vs)) (asep (k vs'))
where k vs = map ppKinded (zipTyped (vs:>:ks))
vs' = map snd s
qt' = apply (S s) qt
s = [(v,hsTyVar (ltvar name) `asTypeOf` t) | (v,name) <- zip vs names]
vs:>:ks = unzipTyped (aks++vks) -- hmm
n = length aks
asep avs =
if null as
then fsep vs
else braces (fsep as)<+>fsep vs
where (as,vs) = splitAt n avs
-- Infinite supplies of variables names:
varnames = map single [alpha..omega]++asciinames
where alpha='\x03b1'; omega='\x03c9'
asciinames = map single letters++[a:show n|n<-[1..],a<-letters]
single x = [x]
letters = ['a'..'z']
ppKinded (x:>:k) = if k==kstar then ppi x else parens (x<>el<>k)
instance (IsSpecialName i,Printable i,Printable t)
=> Printable (Qual i t) where
ppi ([]:=>t) = ppi t
ppi (ps:=>t) = sep [ppiFTuple ps <+> imp, letNest t]
instance (Printable x,Printable t) => Printable (Typing x t) where
ppi (x:>:t) = sep [wrap x <+> el,letNest t]
ppiList xts = vcat xts
instance (ValueId i,TypeId i) => Printable (TypeInfo i) where
ppi i =
case i of
Data -> ppi "data" -- <+> o
Newtype -> ppi "newtype" -- <+> o
Class super ps fundeps methods ->
"class" <+> sep [ppi (ppContext super<+>"_"<+>fsep (map ppKinded ps)),
ppFunDeps fundeps,
ppi "where", letNest methods]
Synonym ps t ->
"type" <+> appv (p:ps) <+> "=" <+> letNest t
Tyvar -> ppi "type variable"
where
p = localVal "_"
appv = asType . appT . map tyvar
asType = id :: Type i -> Type i
instance (IsSpecialName i,Printable i) => Printable (Subst i) where
ppi (S s) = ppi s