TiPretty.hs

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

Plain-text version of TiPretty.hs | Valid HTML?