packages feed

lambda-cube-0.3.0.0: src/LambdaCube/SystemF/PrettyPrinter.hs

{- |
  TODO: Use real pretty printer library
-}
{-# LANGUAGE OverloadedStrings #-}
module LambdaCube.SystemF.PrettyPrinter
  ( prettyUnnamedTerm
  , prettyShowUnnamedTerm
  , prettyUnnamedType
  , prettyShowUnnamedType
  ) where

import           Data.Text                       (Text)
import qualified Data.Text                       as Text
import           LambdaCube.Common.PrettyPrinter
import           LambdaCube.SystemF.Ast

prettyUnnamedTerm :: LCTerm -> Text
prettyUnnamedTerm = prettyUnnamedTermPrec 0

prettyShowUnnamedTerm :: LCTerm -> String
prettyShowUnnamedTerm = Text.unpack . prettyUnnamedTerm

prettyUnnamedType :: LCType -> Text
prettyUnnamedType = prettyUnnamedTypePrec 0

prettyShowUnnamedType :: LCType -> String
prettyShowUnnamedType = Text.unpack . prettyUnnamedType

prettyUnnamedTermPrec :: Int -> LCTerm -> Text
prettyUnnamedTermPrec = go
  where
    pTP = prettyUnnamedTypePrec

    go _ (LCVar x)    = Text.pack $ show x
    go p (LCLam t b)  = wrapIfSpaced (p > 0) ["\\ :", pTP 0 t, ".", go 0 b]
    go p (LCApp f a)  = wrapIfSpaced (p > 1) [go 1 f, go 2 a]
    go p (LCTLam b)   = wrapIfSpaced (p > 0) ["@\\ : * .", go 0 b]
    go p (LCTApp f t) = wrapIfSpaced (p > 1) [go 1 f, "@" <> pTP 1 t]

prettyUnnamedTypePrec :: Int -> LCType -> Text
prettyUnnamedTypePrec = go
  where
    go _ LCBase      = "#"
    go _ (LCTVar p)  = Text.pack $ show p
    go p (LCArr a b) = wrapIfSpaced (p > 0) [go 1 a, "->", go 0 b]
    go p (LCUniv b)  = wrapIfSpaced (p > 0) ["! : * ,", go 0 b]