{-# LANGUAGE FlexibleInstances #-}

-- SPDX-FileCopyrightText: Copyright (c) 2025 Objectionary.com
-- SPDX-License-Identifier: MIT

module Pretty
  ( prettyExpression,
    prettyExpression',
    prettyProgram,
    prettyProgram',
    prettyAttribute,
    prettySubsts,
    prettySubsts',
    prettySubst,
    prettyBinding,
    prettyBytes,
    prettyExtraArg,
    PrintMode (SWEET, SALTY),
    Encoding (ASCII, UNICODE),
  )
where

import Ast
import Data.List (intercalate)
import qualified Data.Map.Strict as Map
import Matcher
import Misc
import Prettyprinter
import Prettyprinter.Render.String (renderString)
import Yaml (ExtraArgument (..))

data PrintMode = SWEET | SALTY
  deriving (PrintMode -> PrintMode -> Bool
(PrintMode -> PrintMode -> Bool)
-> (PrintMode -> PrintMode -> Bool) -> Eq PrintMode
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: PrintMode -> PrintMode -> Bool
== :: PrintMode -> PrintMode -> Bool
$c/= :: PrintMode -> PrintMode -> Bool
/= :: PrintMode -> PrintMode -> Bool
Eq)

instance Show PrintMode where
  show :: PrintMode -> String
show PrintMode
SWEET = String
"sweet"
  show PrintMode
SALTY = String
"salty"

data Encoding = ASCII | UNICODE

newtype Formatted a = Formatted {forall a. Formatted a -> (PrintMode, Encoding, a)
unFormatted :: (PrintMode, Encoding, a)}

formatted :: a -> Formatted a
formatted :: forall a. a -> Formatted a
formatted a
x = (PrintMode, Encoding, a) -> Formatted a
forall a. (PrintMode, Encoding, a) -> Formatted a
Formatted (PrintMode
SALTY, Encoding
UNICODE, a
x)

prettyMeta :: String -> Doc ann
prettyMeta :: forall ann. String -> Doc ann
prettyMeta String
meta = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"!" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
meta

prettyArrow :: Encoding -> Doc ann
prettyArrow :: forall ann. Encoding -> Doc ann
prettyArrow Encoding
UNICODE = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"↦"
prettyArrow Encoding
ASCII = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"->"

prettyLsb :: Encoding -> Doc ann
prettyLsb :: forall ann. Encoding -> Doc ann
prettyLsb Encoding
UNICODE = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"⟦"
prettyLsb Encoding
ASCII = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"[["

prettyRsb :: Encoding -> Doc ann
prettyRsb :: forall ann. Encoding -> Doc ann
prettyRsb Encoding
UNICODE = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"⟧"
prettyRsb Encoding
ASCII = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"]]"

prettyDashedArrow :: Doc ann
prettyDashedArrow :: forall ann. Doc ann
prettyDashedArrow = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"⤍"

prettyLambda :: Encoding -> Doc ann
prettyLambda :: forall ann. Encoding -> Doc ann
prettyLambda Encoding
UNICODE = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"λ" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
forall ann. Doc ann
prettyDashedArrow
prettyLambda Encoding
ASCII = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"L>"

prettyDelta :: Encoding -> Doc ann
prettyDelta :: forall ann. Encoding -> Doc ann
prettyDelta Encoding
UNICODE = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"Δ" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
forall ann. Doc ann
prettyDashedArrow
prettyDelta Encoding
ASCII = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"D>"

instance Pretty ExtraArgument where
  pretty :: forall ann. ExtraArgument -> Doc ann
pretty (ArgExpression Expression
expr) = Formatted Expression -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Formatted Expression -> Doc ann
pretty ((PrintMode, Encoding, Expression) -> Formatted Expression
forall a. (PrintMode, Encoding, a) -> Formatted a
Formatted (PrintMode
SWEET, Encoding
UNICODE, Expression
expr))
  pretty (ArgBinding Binding
bd) = Formatted Binding -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Formatted Binding -> Doc ann
pretty ((PrintMode, Encoding, Binding) -> Formatted Binding
forall a. (PrintMode, Encoding, a) -> Formatted a
Formatted (PrintMode
SWEET, Encoding
UNICODE, Binding
bd))
  pretty (ArgAttribute Attribute
attr) = Formatted Attribute -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Formatted Attribute -> Doc ann
pretty (Attribute -> Formatted Attribute
forall a. a -> Formatted a
formatted Attribute
attr)
  pretty (ArgBytes Bytes
bytes) = Bytes -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Bytes -> Doc ann
pretty Bytes
bytes

instance Pretty Bytes where
  pretty :: forall ann. Bytes -> Doc ann
pretty Bytes
BtEmpty = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"--"
  pretty (BtOne String
bt) = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
bt Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"-"
  pretty (BtMany [String]
bts) = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (String -> [String] -> String
forall a. [a] -> [[a]] -> [a]
intercalate String
"-" [String]
bts)
  pretty (BtMeta String
meta) = String -> Doc ann
forall ann. String -> Doc ann
prettyMeta String
meta

instance Pretty (Formatted Attribute) where
  pretty :: forall ann. Formatted Attribute -> Doc ann
pretty (Formatted (PrintMode
_, Encoding
_, AtMeta String
meta)) = String -> Doc ann
forall ann. String -> Doc ann
prettyMeta String
meta
  pretty (Formatted (PrintMode
_, Encoding
ASCII, AtAlpha Integer
idx)) = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"~" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Integer -> Doc ann
forall ann. Integer -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Integer
idx
  pretty (Formatted (PrintMode
_, Encoding
ASCII, Attribute
AtPhi)) = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"@"
  pretty (Formatted (PrintMode
_, Encoding
ASCII, Attribute
AtRho)) = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"^"
  pretty (Formatted (PrintMode
_, Encoding
_, Attribute
attr)) = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (Attribute -> String
forall a. Show a => a -> String
show Attribute
attr)

instance Pretty (Formatted Binding) where
  pretty :: forall ann. Formatted Binding -> Doc ann
pretty (Formatted (PrintMode
SWEET, Encoding
encoding, BiTau Attribute
attr (ExFormation [Binding]
bindings))) =
    let voids' :: [Attribute]
voids' = [Binding] -> [Attribute]
voids [Binding]
bindings
     in if [Attribute] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Attribute]
voids'
          then Formatted Attribute -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Formatted Attribute -> Doc ann
pretty ((PrintMode, Encoding, Attribute) -> Formatted Attribute
forall a. (PrintMode, Encoding, a) -> Formatted a
Formatted (PrintMode
SWEET, Encoding
encoding, Attribute
attr)) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Encoding -> Doc ann
forall ann. Encoding -> Doc ann
prettyArrow Encoding
encoding Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Formatted Expression -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Formatted Expression -> Doc ann
pretty ((PrintMode, Encoding, Expression) -> Formatted Expression
forall a. (PrintMode, Encoding, a) -> Formatted a
Formatted (PrintMode
SWEET, Encoding
encoding, [Binding] -> Expression
ExFormation [Binding]
bindings))
          else
            if [Attribute] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Attribute]
voids' Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== [Binding] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Binding]
bindings Bool -> Bool -> Bool
&& [Attribute] -> Attribute
forall a. HasCallStack => [a] -> a
last [Attribute]
voids' Attribute -> Attribute -> Bool
forall a. Eq a => a -> a -> Bool
== Attribute
AtRho
              then [Attribute] -> Doc ann
forall ann. [Attribute] -> Doc ann
inlineVoids ([Attribute] -> [Attribute]
forall a. HasCallStack => [a] -> [a]
init [Attribute]
voids') Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Encoding -> Doc ann
forall ann. Encoding -> Doc ann
prettyLsb Encoding
encoding Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Encoding -> Doc ann
forall ann. Encoding -> Doc ann
prettyRsb Encoding
encoding
              else [Attribute] -> Doc ann
forall ann. [Attribute] -> Doc ann
inlineVoids [Attribute]
voids' Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Formatted Expression -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Formatted Expression -> Doc ann
pretty ((PrintMode, Encoding, Expression) -> Formatted Expression
forall a. (PrintMode, Encoding, a) -> Formatted a
Formatted (PrintMode
SWEET, Encoding
encoding, [Binding] -> Expression
ExFormation (Int -> [Binding] -> [Binding]
forall a. Int -> [a] -> [a]
drop ([Attribute] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Attribute]
voids') [Binding]
bindings)))
    where
      voids :: [Binding] -> [Attribute]
      voids :: [Binding] -> [Attribute]
voids [] = []
      voids (Binding
bd : [Binding]
bds) = case Binding
bd of
        BiVoid Attribute
attr -> Attribute
attr Attribute -> [Attribute] -> [Attribute]
forall a. a -> [a] -> [a]
: [Binding] -> [Attribute]
voids [Binding]
bds
        Binding
_ -> []
      inlineVoids :: [Attribute] -> Doc ann
      inlineVoids :: forall ann. [Attribute] -> Doc ann
inlineVoids [] = Formatted Attribute -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Formatted Attribute -> Doc ann
pretty ((PrintMode, Encoding, Attribute) -> Formatted Attribute
forall a. (PrintMode, Encoding, a) -> Formatted a
Formatted (PrintMode
SWEET, Encoding
encoding, Attribute
attr)) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Encoding -> Doc ann
forall ann. Encoding -> Doc ann
prettyArrow Encoding
encoding
      inlineVoids [Attribute]
voids' =
        Formatted Attribute -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Formatted Attribute -> Doc ann
pretty ((PrintMode, Encoding, Attribute) -> Formatted Attribute
forall a. (PrintMode, Encoding, a) -> Formatted a
Formatted (PrintMode
SWEET, Encoding
encoding, Attribute
attr))
          Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
forall ann. Doc ann
lparen
          Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ((Attribute -> Doc ann) -> [Attribute] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map (\Attribute
attr -> Formatted Attribute -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Formatted Attribute -> Doc ann
pretty ((PrintMode, Encoding, Attribute) -> Formatted Attribute
forall a. (PrintMode, Encoding, a) -> Formatted a
Formatted (PrintMode
SWEET, Encoding
encoding, Attribute
attr))) [Attribute]
voids'))
          Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
forall ann. Doc ann
rparen
          Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Encoding -> Doc ann
forall ann. Encoding -> Doc ann
prettyArrow Encoding
encoding
  pretty (Formatted (PrintMode
mode, Encoding
encoding, BiTau Attribute
attr Expression
expr)) = Formatted Attribute -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Formatted Attribute -> Doc ann
pretty ((PrintMode, Encoding, Attribute) -> Formatted Attribute
forall a. (PrintMode, Encoding, a) -> Formatted a
Formatted (PrintMode
mode, Encoding
encoding, Attribute
attr)) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Encoding -> Doc ann
forall ann. Encoding -> Doc ann
prettyArrow Encoding
encoding Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Formatted Expression -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Formatted Expression -> Doc ann
pretty ((PrintMode, Encoding, Expression) -> Formatted Expression
forall a. (PrintMode, Encoding, a) -> Formatted a
Formatted (PrintMode
mode, Encoding
encoding, Expression
expr))
  pretty (Formatted (PrintMode
_, Encoding
_, BiMeta String
meta)) = String -> Doc ann
forall ann. String -> Doc ann
prettyMeta String
meta
  pretty (Formatted (PrintMode
_, Encoding
encoding, BiDelta Bytes
bytes)) = Encoding -> Doc ann
forall ann. Encoding -> Doc ann
prettyDelta Encoding
encoding Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Bytes -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Bytes -> Doc ann
pretty Bytes
bytes
  pretty (Formatted (PrintMode
_, Encoding
encoding, BiLambda String
func)) = Encoding -> Doc ann
forall ann. Encoding -> Doc ann
prettyLambda Encoding
encoding Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
func
  pretty (Formatted (PrintMode
_, Encoding
encoding, BiMetaLambda String
meta)) = Encoding -> Doc ann
forall ann. Encoding -> Doc ann
prettyLambda Encoding
encoding Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> String -> Doc ann
forall ann. String -> Doc ann
prettyMeta String
meta
  pretty (Formatted (PrintMode
mode, Encoding
UNICODE, BiVoid Attribute
attr)) = Formatted Attribute -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Formatted Attribute -> Doc ann
pretty ((PrintMode, Encoding, Attribute) -> Formatted Attribute
forall a. (PrintMode, Encoding, a) -> Formatted a
Formatted (PrintMode
mode, Encoding
UNICODE, Attribute
attr)) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Encoding -> Doc ann
forall ann. Encoding -> Doc ann
prettyArrow Encoding
UNICODE Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"∅"
  pretty (Formatted (PrintMode
mode, Encoding
ASCII, BiVoid Attribute
attr)) = Formatted Attribute -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Formatted Attribute -> Doc ann
pretty ((PrintMode, Encoding, Attribute) -> Formatted Attribute
forall a. (PrintMode, Encoding, a) -> Formatted a
Formatted (PrintMode
mode, Encoding
ASCII, Attribute
attr)) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Encoding -> Doc ann
forall ann. Encoding -> Doc ann
prettyArrow Encoding
ASCII Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"?"

-- >>> render (Formatted (SWEET, UNICODE, [BiVoid AtRho]))
-- ""
-- >>> render (Formatted (SWEET, UNICODE, [BiTau (AtLabel "x") ExGlobal, BiVoid AtPhi]))
-- "x \8614 \934,\n\966 \8614 \8709"
instance {-# OVERLAPPING #-} Pretty (Formatted [Binding]) where
  pretty :: forall ann. Formatted [Binding] -> Doc ann
pretty (Formatted (PrintMode
SWEET, Encoding
encoding, [Binding]
bds)) = [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
vsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ((Binding -> Doc ann) -> [Doc ann] -> [Binding] -> [Doc ann]
forall ann.
(Binding -> Doc ann) -> [Doc ann] -> [Binding] -> [Doc ann]
excludeVoidRho (\Binding
bd -> Formatted Binding -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Formatted Binding -> Doc ann
pretty ((PrintMode, Encoding, Binding) -> Formatted Binding
forall a. (PrintMode, Encoding, a) -> Formatted a
Formatted (PrintMode
SWEET, Encoding
encoding, Binding
bd))) [] [Binding]
bds))
    where
      excludeVoidRho :: (Binding -> Doc ann) -> [Doc ann] -> [Binding] -> [Doc ann]
      excludeVoidRho :: forall ann.
(Binding -> Doc ann) -> [Doc ann] -> [Binding] -> [Doc ann]
excludeVoidRho Binding -> Doc ann
func [Doc ann]
acc [Binding
bd] = case Binding
bd of
        BiVoid Attribute
AtRho -> [Doc ann] -> [Doc ann]
forall a. [a] -> [a]
reverse [Doc ann]
acc
        Binding
_ -> [Doc ann] -> [Doc ann]
forall a. [a] -> [a]
reverse (Binding -> Doc ann
func Binding
bd Doc ann -> [Doc ann] -> [Doc ann]
forall a. a -> [a] -> [a]
: [Doc ann]
acc)
      excludeVoidRho Binding -> Doc ann
func [Doc ann]
acc (Binding
x : [Binding]
xs) = (Binding -> Doc ann) -> [Doc ann] -> [Binding] -> [Doc ann]
forall ann.
(Binding -> Doc ann) -> [Doc ann] -> [Binding] -> [Doc ann]
excludeVoidRho Binding -> Doc ann
func (Binding -> Doc ann
func Binding
x Doc ann -> [Doc ann] -> [Doc ann]
forall a. a -> [a] -> [a]
: [Doc ann]
acc) [Binding]
xs
      excludeVoidRho Binding -> Doc ann
func [Doc ann]
acc [] = [Doc ann] -> [Doc ann]
forall a. [a] -> [a]
reverse [Doc ann]
acc
  pretty (Formatted (PrintMode
SALTY, Encoding
encoding, [Binding]
bds)) = [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
vsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ((Binding -> Doc ann) -> [Binding] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map (\Binding
bd -> Formatted Binding -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Formatted Binding -> Doc ann
pretty ((PrintMode, Encoding, Binding) -> Formatted Binding
forall a. (PrintMode, Encoding, a) -> Formatted a
Formatted (PrintMode
SALTY, Encoding
encoding, Binding
bd))) [Binding]
bds))

complexApplication :: Expression -> (Expression, [Binding], [Expression])
complexApplication :: Expression -> (Expression, [Binding], [Expression])
complexApplication (ExApplication (ExApplication Expression
expr Binding
tau) Binding
tau') =
  let (Expression
before, [Binding]
taus, [Expression]
exprs) = Expression -> (Expression, [Binding], [Expression])
complexApplication (Expression -> Binding -> Expression
ExApplication Expression
expr Binding
tau)
      taus' :: [Binding]
taus' = Binding
tau' Binding -> [Binding] -> [Binding]
forall a. a -> [a] -> [a]
: [Binding]
taus
   in if [Expression] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Expression]
exprs
        then (Expression
before, [Binding]
taus', [])
        else case Binding
tau' of
          BiTau (AtAlpha Integer
idx) Expression
expr' ->
            if Integer
idx Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
== Int -> Integer
forall a b. (Integral a, Num b) => a -> b
fromIntegral ([Expression] -> Int
forall a. [a] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [Expression]
exprs)
              then (Expression
before, [Binding]
taus', Expression
expr' Expression -> [Expression] -> [Expression]
forall a. a -> [a] -> [a]
: [Expression]
exprs)
              else (Expression
before, [Binding]
taus', [])
          Binding
_ -> (Expression
before, [Binding]
taus', [])
complexApplication (ExApplication Expression
expr (BiTau (AtAlpha Integer
0) Expression
expr')) = (Expression
expr, [Attribute -> Expression -> Binding
BiTau (Integer -> Attribute
AtAlpha Integer
0) Expression
expr'], [Expression
expr'])
complexApplication (ExApplication Expression
expr Binding
tau) = (Expression
expr, [Binding
tau], [])

-- >>> render (Formatted (SWEET, ExFormation [BiVoid AtRho]))
-- "\10214\10215"
instance Pretty (Formatted Expression) where
  pretty :: forall ann. Formatted Expression -> Doc ann
pretty (Formatted (PrintMode
SWEET, Encoding
UNICODE, ExDispatch (ExDispatch Expression
ExGlobal (AtLabel String
"org")) (AtLabel String
"eolang"))) = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"Φ̇"
  pretty (Formatted (PrintMode
SWEET, Encoding
ASCII, ExDispatch (ExDispatch Expression
ExGlobal (AtLabel String
"org")) (AtLabel String
"eolang"))) = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"QQ"
  pretty (Formatted (PrintMode
SWEET, Encoding
_, DataString Bytes
bytes)) = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"\"" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (Bytes -> String
btsToStr Bytes
bytes) Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"\""
  pretty (Formatted (PrintMode
SWEET, Encoding
_, DataNumber Bytes
bytes)) = (Integer -> Doc ann)
-> (Double -> Doc ann) -> Either Integer Double -> Doc ann
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either Integer -> Doc ann
forall ann. Integer -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Double -> Doc ann
forall ann. Double -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (Bytes -> Either Integer Double
btsToNum Bytes
bytes)
  pretty (Formatted (PrintMode
SWEET, Encoding
encoding, DataObject String
other Bytes
bytes)) = Formatted Expression -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Formatted Expression -> Doc ann
pretty ((PrintMode, Encoding, Expression) -> Formatted Expression
forall a. (PrintMode, Encoding, a) -> Formatted a
Formatted (PrintMode
SALTY, Encoding
encoding, String -> Bytes -> Expression
DataObject String
other Bytes
bytes))
  pretty (Formatted (PrintMode
SWEET, Encoding
UNICODE, ExFormation [BiVoid Attribute
AtRho])) = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"⟦⟧"
  pretty (Formatted (PrintMode
SWEET, Encoding
ASCII, ExFormation [BiVoid Attribute
AtRho])) = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"[[]]"
  pretty (Formatted (PrintMode
mode, Encoding
encoding, ExFormation [Binding
binding])) = case Binding
binding of
    BiTau Attribute
_ Expression
_ -> [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
vsep [Encoding -> Doc ann
forall ann. Encoding -> Doc ann
prettyLsb Encoding
encoding, Int -> Doc ann -> Doc ann
forall ann. Int -> Doc ann -> Doc ann
indent Int
2 (Formatted Binding -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Formatted Binding -> Doc ann
pretty ((PrintMode, Encoding, Binding) -> Formatted Binding
forall a. (PrintMode, Encoding, a) -> Formatted a
Formatted (PrintMode
mode, Encoding
encoding, Binding
binding))), Encoding -> Doc ann
forall ann. Encoding -> Doc ann
prettyRsb Encoding
encoding]
    Binding
_ -> Encoding -> Doc ann
forall ann. Encoding -> Doc ann
prettyLsb Encoding
encoding Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Formatted Binding -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Formatted Binding -> Doc ann
pretty ((PrintMode, Encoding, Binding) -> Formatted Binding
forall a. (PrintMode, Encoding, a) -> Formatted a
Formatted (PrintMode
mode, Encoding
encoding, Binding
binding)) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Encoding -> Doc ann
forall ann. Encoding -> Doc ann
prettyRsb Encoding
encoding
  pretty (Formatted (PrintMode
_, Encoding
UNICODE, ExFormation [])) = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"⟦⟧"
  pretty (Formatted (PrintMode
_, Encoding
ASCII, ExFormation [])) = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"[[]]"
  pretty (Formatted (PrintMode
mode, Encoding
encoding, ExFormation [Binding]
bindings)) = [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
vsep [Encoding -> Doc ann
forall ann. Encoding -> Doc ann
prettyLsb Encoding
encoding, Int -> Doc ann -> Doc ann
forall ann. Int -> Doc ann -> Doc ann
indent Int
2 (Formatted [Binding] -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Formatted [Binding] -> Doc ann
pretty ((PrintMode, Encoding, [Binding]) -> Formatted [Binding]
forall a. (PrintMode, Encoding, a) -> Formatted a
Formatted (PrintMode
mode, Encoding
encoding, [Binding]
bindings))), Encoding -> Doc ann
forall ann. Encoding -> Doc ann
prettyRsb Encoding
encoding]
  pretty (Formatted (PrintMode
_, Encoding
UNICODE, Expression
ExThis)) = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"ξ"
  pretty (Formatted (PrintMode
_, Encoding
ASCII, Expression
ExThis)) = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"$"
  pretty (Formatted (PrintMode
_, Encoding
UNICODE, Expression
ExGlobal)) = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"Φ"
  pretty (Formatted (PrintMode
_, Encoding
ASCII, Expression
ExGlobal)) = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"Q"
  pretty (Formatted (PrintMode
_, Encoding
UNICODE, Expression
ExTermination)) = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"⊥"
  pretty (Formatted (PrintMode
_, Encoding
ASCII, Expression
ExTermination)) = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"T"
  pretty (Formatted (PrintMode
_, Encoding
_, ExMeta String
meta)) = String -> Doc ann
forall ann. String -> Doc ann
prettyMeta String
meta
  pretty (Formatted (PrintMode
SWEET, Encoding
encoding, ExApplication (ExApplication Expression
expr Binding
tau) Binding
tau')) =
    let (Expression
expr', [Binding]
taus, [Expression]
exprs) = Expression -> (Expression, [Binding], [Expression])
complexApplication (Expression -> Binding -> Expression
ExApplication (Expression -> Binding -> Expression
ExApplication Expression
expr Binding
tau) Binding
tau')
        args :: Doc ann
args =
          if [Expression] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [Expression]
exprs
            then Formatted [Binding] -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Formatted [Binding] -> Doc ann
pretty ((PrintMode, Encoding, [Binding]) -> Formatted [Binding]
forall a. (PrintMode, Encoding, a) -> Formatted a
Formatted (PrintMode
SWEET, Encoding
encoding, [Binding] -> [Binding]
forall a. [a] -> [a]
reverse [Binding]
taus))
            else [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
vsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ((Expression -> Doc ann) -> [Expression] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map (\Expression
exp -> Formatted Expression -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Formatted Expression -> Doc ann
pretty ((PrintMode, Encoding, Expression) -> Formatted Expression
forall a. (PrintMode, Encoding, a) -> Formatted a
Formatted (PrintMode
SWEET, Encoding
encoding, Expression
exp))) ([Expression] -> [Expression]
forall a. [a] -> [a]
reverse [Expression]
exprs)))
     in Formatted Expression -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Formatted Expression -> Doc ann
pretty ((PrintMode, Encoding, Expression) -> Formatted Expression
forall a. (PrintMode, Encoding, a) -> Formatted a
Formatted (PrintMode
SWEET, Encoding
encoding, Expression
expr')) Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
vsep [Doc ann
forall ann. Doc ann
lparen, Int -> Doc ann -> Doc ann
forall ann. Int -> Doc ann -> Doc ann
indent Int
2 Doc ann
forall ann. Doc ann
args, Doc ann
forall ann. Doc ann
rparen]
  pretty (Formatted (PrintMode
SWEET, Encoding
encoding, ExApplication Expression
expr Binding
tau)) =
    let arg :: Doc ann
arg = case Binding
tau of
          BiTau (AtAlpha Integer
0) Expression
expr' -> Formatted Expression -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Formatted Expression -> Doc ann
pretty ((PrintMode, Encoding, Expression) -> Formatted Expression
forall a. (PrintMode, Encoding, a) -> Formatted a
Formatted (PrintMode
SWEET, Encoding
encoding, Expression
expr'))
          Binding
_ -> Formatted Binding -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Formatted Binding -> Doc ann
pretty ((PrintMode, Encoding, Binding) -> Formatted Binding
forall a. (PrintMode, Encoding, a) -> Formatted a
Formatted (PrintMode
SWEET, Encoding
encoding, Binding
tau))
     in Formatted Expression -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Formatted Expression -> Doc ann
pretty ((PrintMode, Encoding, Expression) -> Formatted Expression
forall a. (PrintMode, Encoding, a) -> Formatted a
Formatted (PrintMode
SWEET, Encoding
encoding, Expression
expr)) Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
vsep [Doc ann
forall ann. Doc ann
lparen, Int -> Doc ann -> Doc ann
forall ann. Int -> Doc ann -> Doc ann
indent Int
2 Doc ann
forall ann. Doc ann
arg, Doc ann
forall ann. Doc ann
rparen]
  pretty (Formatted (PrintMode
mode, Encoding
encoding, ExApplication Expression
expr Binding
tau)) = Formatted Expression -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Formatted Expression -> Doc ann
pretty ((PrintMode, Encoding, Expression) -> Formatted Expression
forall a. (PrintMode, Encoding, a) -> Formatted a
Formatted (PrintMode
mode, Encoding
encoding, Expression
expr)) Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
vsep [Doc ann
forall ann. Doc ann
lparen, Int -> Doc ann -> Doc ann
forall ann. Int -> Doc ann -> Doc ann
indent Int
2 (Formatted Binding -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Formatted Binding -> Doc ann
pretty ((PrintMode, Encoding, Binding) -> Formatted Binding
forall a. (PrintMode, Encoding, a) -> Formatted a
Formatted (PrintMode
mode, Encoding
encoding, Binding
tau))), Doc ann
forall ann. Doc ann
rparen]
  pretty (Formatted (PrintMode
mode, Encoding
encoding, ExDispatch Expression
expr Attribute
attr)) = Formatted Expression -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Formatted Expression -> Doc ann
pretty ((PrintMode, Encoding, Expression) -> Formatted Expression
forall a. (PrintMode, Encoding, a) -> Formatted a
Formatted (PrintMode
mode, Encoding
encoding, Expression
expr)) Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"." Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Formatted Attribute -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Formatted Attribute -> Doc ann
pretty ((PrintMode, Encoding, Attribute) -> Formatted Attribute
forall a. (PrintMode, Encoding, a) -> Formatted a
Formatted (PrintMode
mode, Encoding
encoding, Attribute
attr))
  pretty (Formatted (PrintMode
mode, Encoding
encoding, ExMetaTail Expression
expr String
meta)) = Formatted Expression -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Formatted Expression -> Doc ann
pretty ((PrintMode, Encoding, Expression) -> Formatted Expression
forall a. (PrintMode, Encoding, a) -> Formatted a
Formatted (PrintMode
mode, Encoding
encoding, Expression
expr)) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"*" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> String -> Doc ann
forall ann. String -> Doc ann
prettyMeta String
meta

instance Pretty (Formatted Program) where
  pretty :: forall ann. Formatted Program -> Doc ann
pretty (Formatted (PrintMode
SALTY, Encoding
encoding, Program Expression
expr)) = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"Φ" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Encoding -> Doc ann
forall ann. Encoding -> Doc ann
prettyArrow Encoding
encoding Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Formatted Expression -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Formatted Expression -> Doc ann
pretty ((PrintMode, Encoding, Expression) -> Formatted Expression
forall a. (PrintMode, Encoding, a) -> Formatted a
Formatted (PrintMode
SALTY, Encoding
encoding, Expression
expr))
  pretty (Formatted (PrintMode
SWEET, Encoding
encoding, Program Expression
expr)) = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"{" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Formatted Expression -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Formatted Expression -> Doc ann
pretty ((PrintMode, Encoding, Expression) -> Formatted Expression
forall a. (PrintMode, Encoding, a) -> Formatted a
Formatted (PrintMode
SWEET, Encoding
encoding, Expression
expr)) Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"}"

instance Pretty Tail where
  pretty :: forall ann. Tail -> Doc ann
pretty (TaApplication Binding
tau) = [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
vsep [Doc ann
forall ann. Doc ann
lparen, Int -> Doc ann -> Doc ann
forall ann. Int -> Doc ann -> Doc ann
indent Int
2 (Formatted Binding -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Formatted Binding -> Doc ann
pretty (Binding -> Formatted Binding
forall a. a -> Formatted a
formatted Binding
tau)), Doc ann
forall ann. Doc ann
rparen]
  pretty (TaDispatch Attribute
attr) = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"." Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Formatted Attribute -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Formatted Attribute -> Doc ann
pretty (Attribute -> Formatted Attribute
forall a. a -> Formatted a
formatted Attribute
attr)

instance Pretty MetaValue where
  pretty :: forall ann. MetaValue -> Doc ann
pretty (MvAttribute Attribute
attr) = Formatted Attribute -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Formatted Attribute -> Doc ann
pretty (Attribute -> Formatted Attribute
forall a. a -> Formatted a
formatted Attribute
attr)
  pretty (MvBytes Bytes
bytes) = Bytes -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Bytes -> Doc ann
pretty Bytes
bytes
  pretty (MvBindings []) = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"[]"
  pretty (MvBindings [Binding]
bindings) = [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
vsep [String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"[", Int -> Doc ann -> Doc ann
forall ann. Int -> Doc ann -> Doc ann
indent Int
2 (Formatted [Binding] -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Formatted [Binding] -> Doc ann
pretty ([Binding] -> Formatted [Binding]
forall a. a -> Formatted a
formatted [Binding]
bindings)), String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"]"]
  pretty (MvFunction String
func) = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
func
  pretty (MvExpression Expression
expr Expression
_) = Formatted Expression -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Formatted Expression -> Doc ann
pretty (Expression -> Formatted Expression
forall a. a -> Formatted a
formatted Expression
expr)
  pretty (MvTail [Tail]
tails) = [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
vsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ((Tail -> Doc ann) -> [Tail] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map Tail -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Tail -> Doc ann
pretty [Tail]
tails))

instance Pretty Subst where
  pretty :: forall ann. Subst -> Doc ann
pretty (Subst Map String MetaValue
mp) =
    [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
vsep
      [ Doc ann
forall ann. Doc ann
lparen,
        Int -> Doc ann -> Doc ann
forall ann. Int -> Doc ann -> Doc ann
indent
          Int
2
          ( [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
vsep
              ( Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate
                  Doc ann
forall ann. Doc ann
comma
                  ( ((String, MetaValue) -> Doc ann)
-> [(String, MetaValue)] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map
                      (\(String
key, MetaValue
value) -> String -> Doc ann
forall ann. String -> Doc ann
prettyMeta String
key Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
">>" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> MetaValue -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. MetaValue -> Doc ann
pretty MetaValue
value)
                      (Map String MetaValue -> [(String, MetaValue)]
forall k a. Map k a -> [(k, a)]
Map.toList Map String MetaValue
mp)
                  )
              )
          ),
        Doc ann
forall ann. Doc ann
rparen
      ]

instance {-# OVERLAPPING #-} Pretty (Formatted [Subst]) where
  pretty :: forall ann. Formatted [Subst] -> Doc ann
pretty (Formatted (PrintMode
_, Encoding
_, [])) = String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"[]"
  pretty (Formatted (PrintMode
mode, Encoding
_, [Subst]
substs)) = [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
vsep [String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"[", Int -> Doc ann -> Doc ann
forall ann. Int -> Doc ann -> Doc ann
indent Int
2 ([Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
vsep (Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
forall ann. Doc ann
comma ((Subst -> Doc ann) -> [Subst] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
map Subst -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Subst -> Doc ann
pretty [Subst]
substs))), String -> Doc ann
forall ann. String -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty String
"]"]

render :: (Pretty a) => a -> String
render :: forall a. Pretty a => a -> String
render a
printable = SimpleDocStream Any -> String
forall ann. SimpleDocStream ann -> String
renderString (LayoutOptions -> Doc Any -> SimpleDocStream Any
forall ann. LayoutOptions -> Doc ann -> SimpleDocStream ann
layoutPretty LayoutOptions
defaultLayoutOptions (a -> Doc Any
forall ann. a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty a
printable))

prettyBinding :: Binding -> String
prettyBinding :: Binding -> String
prettyBinding Binding
binding = Formatted Binding -> String
forall a. Pretty a => a -> String
render (Binding -> Formatted Binding
forall a. a -> Formatted a
formatted Binding
binding)

prettyExtraArg :: ExtraArgument -> String
prettyExtraArg :: ExtraArgument -> String
prettyExtraArg = ExtraArgument -> String
forall a. Pretty a => a -> String
render

prettyBytes :: Bytes -> String
prettyBytes :: Bytes -> String
prettyBytes = Bytes -> String
forall a. Pretty a => a -> String
render

prettyAttribute :: Attribute -> String
prettyAttribute :: Attribute -> String
prettyAttribute Attribute
attr = Formatted Attribute -> String
forall a. Pretty a => a -> String
render (Attribute -> Formatted Attribute
forall a. a -> Formatted a
formatted Attribute
attr)

prettySubst :: Subst -> String
prettySubst :: Subst -> String
prettySubst = Subst -> String
forall a. Pretty a => a -> String
render

prettySubsts :: [Subst] -> String
prettySubsts :: [Subst] -> String
prettySubsts = [Subst] -> String
forall a. Pretty a => a -> String
render

prettySubsts' :: [Subst] -> PrintMode -> Encoding -> String
prettySubsts' :: [Subst] -> PrintMode -> Encoding -> String
prettySubsts' [Subst]
substs PrintMode
mode Encoding
encoding = Formatted [Subst] -> String
forall a. Pretty a => a -> String
render ((PrintMode, Encoding, [Subst]) -> Formatted [Subst]
forall a. (PrintMode, Encoding, a) -> Formatted a
Formatted (PrintMode
mode, Encoding
encoding, [Subst]
substs))

prettyExpression :: Expression -> String
prettyExpression :: Expression -> String
prettyExpression Expression
expr = Formatted Expression -> String
forall a. Pretty a => a -> String
render (Expression -> Formatted Expression
forall a. a -> Formatted a
formatted Expression
expr)

prettyExpression' :: Expression -> String
prettyExpression' :: Expression -> String
prettyExpression' Expression
expr = Formatted Expression -> String
forall a. Pretty a => a -> String
render ((PrintMode, Encoding, Expression) -> Formatted Expression
forall a. (PrintMode, Encoding, a) -> Formatted a
Formatted (PrintMode
SWEET, Encoding
UNICODE, Expression
expr))

prettyProgram :: Program -> String
prettyProgram :: Program -> String
prettyProgram Program
prog = Formatted Program -> String
forall a. Pretty a => a -> String
render (Program -> Formatted Program
forall a. a -> Formatted a
formatted Program
prog)

prettyProgram' :: Program -> PrintMode -> Encoding -> String
prettyProgram' :: Program -> PrintMode -> Encoding -> String
prettyProgram' Program
prog PrintMode
mode Encoding
encoding = Formatted Program -> String
forall a. Pretty a => a -> String
render ((PrintMode, Encoding, Program) -> Formatted Program
forall a. (PrintMode, Encoding, a) -> Formatted a
Formatted (PrintMode
mode, Encoding
encoding, Program
prog))