-- | Provides a pretty-printing fold
module Data.Origami.Internal.Pretty(prettyFold) where

import Data.Origami.Internal.Fold(Fold(..))
import Text.PrettyPrint

------------------------------------------------------------
-- pretty
------------------------------------------------------------

-- | Folds the 'FoldFamily' fold family into pretty-printing 'Doc's
prettyFold :: Fold Doc Doc Doc Doc Doc
prettyFold = Fold {
    mkFoldFamily = \ dts -> text "Family" $$ nest 4 (vcat dts),
    mkDataTy = \ nm dcs -> text "Ty" <+> text (show nm) <+> arrow
			       $$ nest 4 (vcat dcs),
    mkDataCase = \ nm dfs -> text "Ctor" <+> text (show nm) <+> arrow
			       $$ nest 4 (vcat dfs),
    mkAtomic = \ ty -> text "Atomic" <+> ty,
    mkNonatomic = \ ty -> text "Nonatomic" <+> ty,
    mkFunct = \ nm df -> hsep [text "Funct", text $ show nm, parens df],
    mkBifunct = \ nm df df'
		     -> hsep [text "Bifunct", text $ show nm, parens df,
							      parens df'],
    mkTrifunct = \ nm df df' df''
		     -> hsep [text "Trifunct", text $ show nm, parens df,
			                                       parens df',
                                                               parens df''],
    mkTy = text . show
    }
    where
    arrow = text "->"