module Language.Sexp.Pretty
( printSexp
, printSexps
) where
import qualified Data.Text as T
import qualified Data.Text.Lazy as Lazy
import Data.Text (Text)
import Data.Scientific
import Text.PrettyPrint.Leijen.Text
import Language.Sexp.Types
text' :: Text -> Doc
text' = text . Lazy.fromStrict
ppKw :: Kw -> Doc
ppKw (Kw kw) = colon <> text' kw
ppAtom :: Atom -> Doc
ppAtom (AtomBool a) = if a then "#t" else "#f"
ppAtom (AtomInt a) = integer a
ppAtom (AtomReal a) = text'. T.pack . formatScientific Generic Nothing $ a
ppAtom (AtomString a) = pretty (show a)
ppAtom (AtomSymbol a) = text' a
ppAtom (AtomKeyword k) = ppKw k
ppSexp :: Sexp -> Doc
ppSexp (Atom _ a) = ppAtom a
ppSexp (Vector _ ss) = brackets (align $ sep (map ppSexp ss))
ppSexp (Quoted _ a) = squote <> ppSexp a
ppSexp (List _ ss) = parens (align $ sep (map ppSexp ss))
printSexp :: Sexp -> Lazy.Text
printSexp = displayT . renderPretty 0.5 75 . ppSexp
printSexps :: [Sexp] -> Lazy.Text
printSexps = displayT . renderPretty 0.5 75 . vsep . map ppSexp