module SyntaxRecPretty where import SyntaxRec import PrettyPrint import SpecialNames import HsTypeStruct import PrettySymbols(rarrow) instance (PrintableOp i,IsSpecialName i) => Printable (HsDeclI i) where ppi (Dec d) = ppi d ppiList [] = empty ppiList ds = vcat $ (map (blankline . ppi) (init ds)) ++ [ppi (last ds)] wrap (Dec d) = wrap d {- We want something like this, instance Rec rec struct => Printable rec where ppi = ppi . struct wrap = ppi . struct but we have to repeat it for each type in the Rec class, since otherwise we get an instance that "overlaps" with everything else... /TH -} instance (PrintableOp i,IsSpecialName i) => Printable (HsExpI i) where ppi = ppi . struct wrap = wrap . struct instance PrintableOp i => Printable (HsPatI i) where ppi = ppi . struct wrap = wrap . struct instance (Printable i,IsSpecialName i) => Printable (HsTypeI i) where --ppi (Typ (HsTyApp (Typ (HsTyCon (Qual (Module "Prelude") "[]"))) t)) = -- brackets $ appParensOff $ ppi t ppi (Typ t) = ppi t -- ppiList [] = empty -- ppiList ts = {-appParensOn $-} ppiSet space $ map struct ts --wrap (Typ (HsTyApp (Typ (HsTyCon (Qual (Module "Prelude") "[]"))) t)) = -- brackets $ appParensOff $ ppi t wrap (Typ t) = wrap t instance (Printable i,IsSpecialName i) => PrintableApp (HsTypeI i) (HsTypeI i) where ppiApp = ppiApp . struct wrapApp = wrapApp . struct instance Printable HsKind where ppi = ppi . struct wrap = wrap . struct instance (Printable i,IsSpecialName i) => PrintableApp i (HsTypeI i) where ppiApp i ts = -- i is always a constructor, not a type variable case ts of [t] | is_list_tycon_name i -> ppListType t [t1,t2] | is_fun_tycon_name i -> sep [wrap t1<+>rarrow,ppi t2] _ | n>=2 && is_tuple_tycon_name (n-1) i -> ppiFTuple ts _ -> tcon (wrap i)<+>fsep (map wrap ts) where n=length ts wrapApp i ts = case ts of [t] | is_list_tycon_name i -> ppListType t [t1,t2] | is_fun_tycon_name i -> parens (sep [wrap t1<+>rarrow,ppi t2]) _ | n>=2 && is_tuple_tycon_name (n-1) i -> ppiFTuple ts _ -> parens (tcon (wrap i)<+>fsep (map wrap ts)) where n=length ts ppListType t = case t of Typ (HsTyCon i) | is_char_tycon_name i -> tcon "String" _ -> brackets t