{-# LANGUAGE CPP #-}
#if __GLASGOW_HASKELL__ <= 708
{-# LANGUAGE OverlappingInstances #-}
#endif
{-# LANGUAGE FlexibleInstances #-}
{-# OPTIONS_GHC -fno-warn-incomplete-patterns #-}

-- | Pretty-printer for Sit.
--   Generated by the BNF converter.

module Sit.Print where

import qualified Sit.Abs
import Data.Char

-- | The top-level printing method.

printTree :: Print a => a -> String
printTree :: forall a. Print a => a -> String
printTree = Doc -> String
render (Doc -> String) -> (a -> Doc) -> a -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> a -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0

type Doc = [ShowS] -> [ShowS]

doc :: ShowS -> Doc
doc :: ShowS -> Doc
doc = (:)

render :: Doc -> String
render :: Doc -> String
render Doc
d = Int -> [String] -> ShowS
rend Int
0 ((ShowS -> String) -> [ShowS] -> [String]
forall a b. (a -> b) -> [a] -> [b]
map (ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ String
"") ([ShowS] -> [String]) -> [ShowS] -> [String]
forall a b. (a -> b) -> a -> b
$ Doc
d []) String
"" where
  rend :: Int -> [String] -> ShowS
rend Int
i [String]
ss = case [String]
ss of
    String
"["      :[String]
ts -> Char -> ShowS
showChar Char
'[' ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [String] -> ShowS
rend Int
i [String]
ts
    String
"("      :[String]
ts -> Char -> ShowS
showChar Char
'(' ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [String] -> ShowS
rend Int
i [String]
ts
    String
"{"      :[String]
ts -> Char -> ShowS
showChar Char
'{' ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> ShowS
new (Int
iInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [String] -> ShowS
rend (Int
iInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) [String]
ts
    String
"}" : String
";":[String]
ts -> Int -> ShowS
new (Int
iInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1) ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
space String
"}" ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> ShowS
showChar Char
';' ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> ShowS
new (Int
iInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1) ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [String] -> ShowS
rend (Int
iInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1) [String]
ts
    String
"}"      :[String]
ts -> Int -> ShowS
new (Int
iInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1) ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> ShowS
showChar Char
'}' ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> ShowS
new (Int
iInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1) ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [String] -> ShowS
rend (Int
iInt -> Int -> Int
forall a. Num a => a -> a -> a
-Int
1) [String]
ts
    [String
";"]        -> Char -> ShowS
showChar Char
';'
    String
";"      :[String]
ts -> Char -> ShowS
showChar Char
';' ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> ShowS
new Int
i ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [String] -> ShowS
rend Int
i [String]
ts
    String
t  : ts :: [String]
ts@(String
p:[String]
_) | String -> Bool
closingOrPunctuation String
p -> String -> ShowS
showString String
t ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [String] -> ShowS
rend Int
i [String]
ts
    String
t        :[String]
ts -> String -> ShowS
space String
t ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> [String] -> ShowS
rend Int
i [String]
ts
    [String]
_            -> ShowS
forall a. a -> a
id
  new :: Int -> ShowS
new Int
i     = Char -> ShowS
showChar Char
'\n' ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> ShowS -> ShowS
replicateS (Int
2Int -> Int -> Int
forall a. Num a => a -> a -> a
*Int
i) (Char -> ShowS
showChar Char
' ') ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> Bool) -> ShowS
forall a. (a -> Bool) -> [a] -> [a]
dropWhile Char -> Bool
isSpace
  space :: String -> ShowS
space String
t String
s =
    case ((Char -> Bool) -> String -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all Char -> Bool
isSpace String
t', String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
spc, String -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null String
rest) of
      (Bool
True , Bool
_   , Bool
True ) -> []              -- remove trailing space
      (Bool
False, Bool
_   , Bool
True ) -> String
t'              -- remove trailing space
      (Bool
False, Bool
True, Bool
False) -> String
t' String -> ShowS
forall a. [a] -> [a] -> [a]
++ Char
' ' Char -> ShowS
forall a. a -> [a] -> [a]
: String
s   -- add space if none
      (Bool, Bool, Bool)
_                    -> String
t' String -> ShowS
forall a. [a] -> [a] -> [a]
++ String
s
    where
      t' :: String
t'          = String -> ShowS
showString String
t []
      (String
spc, String
rest) = (Char -> Bool) -> String -> (String, String)
forall a. (a -> Bool) -> [a] -> ([a], [a])
span Char -> Bool
isSpace String
s

  closingOrPunctuation :: String -> Bool
  closingOrPunctuation :: String -> Bool
closingOrPunctuation [Char
c] = Char
c Char -> String -> Bool
forall (t :: * -> *) a. (Foldable t, Eq a) => a -> t a -> Bool
`elem` String
closerOrPunct
  closingOrPunctuation String
_   = Bool
False

  closerOrPunct :: String
  closerOrPunct :: String
closerOrPunct = String
")],;"

parenth :: Doc -> Doc
parenth :: Doc -> Doc
parenth Doc
ss = ShowS -> Doc
doc (Char -> ShowS
showChar Char
'(') Doc -> Doc -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc
ss Doc -> Doc -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ShowS -> Doc
doc (Char -> ShowS
showChar Char
')')

concatS :: [ShowS] -> ShowS
concatS :: [ShowS] -> ShowS
concatS = (ShowS -> ShowS -> ShowS) -> ShowS -> [ShowS] -> ShowS
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
(.) ShowS
forall a. a -> a
id

concatD :: [Doc] -> Doc
concatD :: [Doc] -> Doc
concatD = (Doc -> Doc -> Doc) -> Doc -> [Doc] -> Doc
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr Doc -> Doc -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
(.) Doc
forall a. a -> a
id

replicateS :: Int -> ShowS -> ShowS
replicateS :: Int -> ShowS -> ShowS
replicateS Int
n ShowS
f = [ShowS] -> ShowS
concatS (Int -> ShowS -> [ShowS]
forall a. Int -> a -> [a]
replicate Int
n ShowS
f)

-- | The printer class does the job.

class Print a where
  prt :: Int -> a -> Doc
  prtList :: Int -> [a] -> Doc
  prtList Int
i = [Doc] -> Doc
concatD ([Doc] -> Doc) -> ([a] -> [Doc]) -> [a] -> Doc
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> Doc) -> [a] -> [Doc]
forall a b. (a -> b) -> [a] -> [b]
map (Int -> a -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
i)

instance {-# OVERLAPPABLE #-} Print a => Print [a] where
  prt :: Int -> [a] -> Doc
prt = Int -> [a] -> Doc
forall a. Print a => Int -> [a] -> Doc
prtList

instance Print Char where
  prt :: Int -> Char -> Doc
prt Int
_ Char
s = ShowS -> Doc
doc (Char -> ShowS
showChar Char
'\'' ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Char -> ShowS
mkEsc Char
'\'' Char
s ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> ShowS
showChar Char
'\'')
  prtList :: Int -> String -> Doc
prtList Int
_ String
s = ShowS -> Doc
doc (Char -> ShowS
showChar Char
'"' ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [ShowS] -> ShowS
concatS ((Char -> ShowS) -> String -> [ShowS]
forall a b. (a -> b) -> [a] -> [b]
map (Char -> Char -> ShowS
mkEsc Char
'"') String
s) ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> ShowS
showChar Char
'"')

mkEsc :: Char -> Char -> ShowS
mkEsc :: Char -> Char -> ShowS
mkEsc Char
q Char
s = case Char
s of
  Char
_ | Char
s Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
q -> Char -> ShowS
showChar Char
'\\' ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> ShowS
showChar Char
s
  Char
'\\'-> String -> ShowS
showString String
"\\\\"
  Char
'\n' -> String -> ShowS
showString String
"\\n"
  Char
'\t' -> String -> ShowS
showString String
"\\t"
  Char
_ -> Char -> ShowS
showChar Char
s

prPrec :: Int -> Int -> Doc -> Doc
prPrec :: Int -> Int -> Doc -> Doc
prPrec Int
i Int
j = if Int
j Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
i then Doc -> Doc
parenth else Doc -> Doc
forall a. a -> a
id

instance Print Integer where
  prt :: Int -> Integer -> Doc
prt Int
_ Integer
x = ShowS -> Doc
doc (Integer -> ShowS
forall a. Show a => a -> ShowS
shows Integer
x)

instance Print Double where
  prt :: Int -> Double -> Doc
prt Int
_ Double
x = ShowS -> Doc
doc (Double -> ShowS
forall a. Show a => a -> ShowS
shows Double
x)

instance Print Sit.Abs.Ident where
  prt :: Int -> Ident -> Doc
prt Int
_ (Sit.Abs.Ident String
i) = ShowS -> Doc
doc (ShowS -> Doc) -> ShowS -> Doc
forall a b. (a -> b) -> a -> b
$ String -> ShowS
showString (String -> ShowS) -> String -> ShowS
forall a b. (a -> b) -> a -> b
$ String
i
  prtList :: Int -> [Ident] -> Doc
prtList Int
_ [Ident
x] = [Doc] -> Doc
concatD [Int -> Ident -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 Ident
x]
  prtList Int
_ (Ident
x:[Ident]
xs) = [Doc] -> Doc
concatD [Int -> Ident -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 Ident
x, Int -> [Ident] -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 [Ident]
xs]

instance Print Sit.Abs.Prg where
  prt :: Int -> Prg -> Doc
prt Int
i Prg
e = case Prg
e of
    Sit.Abs.Prg [Decl]
decls -> Int -> Int -> Doc -> Doc
prPrec Int
i Int
0 ([Doc] -> Doc
concatD [Int -> [Decl] -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 [Decl]
decls])

instance Print Sit.Abs.Decl where
  prt :: Int -> Decl -> Doc
prt Int
i Decl
e = case Decl
e of
    Sit.Abs.Sig Ident
id Exp
exp -> Int -> Int -> Doc -> Doc
prPrec Int
i Int
0 ([Doc] -> Doc
concatD [Int -> Ident -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 Ident
id, ShowS -> Doc
doc (String -> ShowS
showString String
":"), Int -> Exp -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 Exp
exp])
    Sit.Abs.Def Ident
id Exp
exp -> Int -> Int -> Doc -> Doc
prPrec Int
i Int
0 ([Doc] -> Doc
concatD [Int -> Ident -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 Ident
id, ShowS -> Doc
doc (String -> ShowS
showString String
"="), Int -> Exp -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 Exp
exp])
    Sit.Abs.Open QualId
qualid -> Int -> Int -> Doc -> Doc
prPrec Int
i Int
0 ([Doc] -> Doc
concatD [ShowS -> Doc
doc (String -> ShowS
showString String
"open"), ShowS -> Doc
doc (String -> ShowS
showString String
"import"), Int -> QualId -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 QualId
qualid])
    Decl
Sit.Abs.Blank -> Int -> Int -> Doc -> Doc
prPrec Int
i Int
0 ([Doc] -> Doc
concatD [])
  prtList :: Int -> [Decl] -> Doc
prtList Int
_ [Decl
x] = [Doc] -> Doc
concatD [Int -> Decl -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 Decl
x]
  prtList Int
_ (Decl
x:[Decl]
xs) = [Doc] -> Doc
concatD [Int -> Decl -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 Decl
x, ShowS -> Doc
doc (String -> ShowS
showString String
"--;"), Int -> [Decl] -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 [Decl]
xs]

instance Print Sit.Abs.QualId where
  prt :: Int -> QualId -> Doc
prt Int
i QualId
e = case QualId
e of
    Sit.Abs.Sg Ident
id -> Int -> Int -> Doc -> Doc
prPrec Int
i Int
0 ([Doc] -> Doc
concatD [Int -> Ident -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 Ident
id])
    Sit.Abs.Cons QualId
qualid Ident
id -> Int -> Int -> Doc -> Doc
prPrec Int
i Int
0 ([Doc] -> Doc
concatD [Int -> QualId -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 QualId
qualid, ShowS -> Doc
doc (String -> ShowS
showString String
"."), Int -> Ident -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 Ident
id])

instance Print [Sit.Abs.Decl] where
  prt :: Int -> [Decl] -> Doc
prt = Int -> [Decl] -> Doc
forall a. Print a => Int -> [a] -> Doc
prtList

instance Print Sit.Abs.IdU where
  prt :: Int -> IdU -> Doc
prt Int
i IdU
e = case IdU
e of
    Sit.Abs.Id Ident
id -> Int -> Int -> Doc -> Doc
prPrec Int
i Int
0 ([Doc] -> Doc
concatD [Int -> Ident -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 Ident
id])
    IdU
Sit.Abs.Under -> Int -> Int -> Doc -> Doc
prPrec Int
i Int
0 ([Doc] -> Doc
concatD [ShowS -> Doc
doc (String -> ShowS
showString String
"_")])
  prtList :: Int -> [IdU] -> Doc
prtList Int
_ [IdU
x] = [Doc] -> Doc
concatD [Int -> IdU -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 IdU
x]
  prtList Int
_ (IdU
x:[IdU]
xs) = [Doc] -> Doc
concatD [Int -> IdU -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 IdU
x, Int -> [IdU] -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 [IdU]
xs]

instance Print Sit.Abs.Bind where
  prt :: Int -> Bind -> Doc
prt Int
i Bind
e = case Bind
e of
    Sit.Abs.BIrrel Ident
id -> Int -> Int -> Doc -> Doc
prPrec Int
i Int
0 ([Doc] -> Doc
concatD [ShowS -> Doc
doc (String -> ShowS
showString String
"."), Int -> Ident -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 Ident
id])
    Sit.Abs.BRel Ident
id -> Int -> Int -> Doc -> Doc
prPrec Int
i Int
0 ([Doc] -> Doc
concatD [ShowS -> Doc
doc (String -> ShowS
showString String
".."), Int -> Ident -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 Ident
id])
    Sit.Abs.BAnn [Ident]
ids Exp
exp -> Int -> Int -> Doc -> Doc
prPrec Int
i Int
0 ([Doc] -> Doc
concatD [ShowS -> Doc
doc (String -> ShowS
showString String
"("), Int -> [Ident] -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 [Ident]
ids, ShowS -> Doc
doc (String -> ShowS
showString String
":"), Int -> Exp -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 Exp
exp, ShowS -> Doc
doc (String -> ShowS
showString String
")")])
  prtList :: Int -> [Bind] -> Doc
prtList Int
_ [Bind
x] = [Doc] -> Doc
concatD [Int -> Bind -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 Bind
x]
  prtList Int
_ (Bind
x:[Bind]
xs) = [Doc] -> Doc
concatD [Int -> Bind -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 Bind
x, Int -> [Bind] -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 [Bind]
xs]

instance Print [Sit.Abs.Bind] where
  prt :: Int -> [Bind] -> Doc
prt = Int -> [Bind] -> Doc
forall a. Print a => Int -> [a] -> Doc
prtList

instance Print [Sit.Abs.Ident] where
  prt :: Int -> [Ident] -> Doc
prt = Int -> [Ident] -> Doc
forall a. Print a => Int -> [a] -> Doc
prtList

instance Print [Sit.Abs.IdU] where
  prt :: Int -> [IdU] -> Doc
prt = Int -> [IdU] -> Doc
forall a. Print a => Int -> [a] -> Doc
prtList

instance Print Sit.Abs.Exp where
  prt :: Int -> Exp -> Doc
prt Int
i Exp
e = case Exp
e of
    Sit.Abs.Var IdU
idu -> Int -> Int -> Doc -> Doc
prPrec Int
i Int
2 ([Doc] -> Doc
concatD [Int -> IdU -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 IdU
idu])
    Sit.Abs.Int Integer
n -> Int -> Int -> Doc -> Doc
prPrec Int
i Int
2 ([Doc] -> Doc
concatD [Int -> Integer -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 Integer
n])
    Exp
Sit.Abs.Infty -> Int -> Int -> Doc -> Doc
prPrec Int
i Int
2 ([Doc] -> Doc
concatD [ShowS -> Doc
doc (String -> ShowS
showString String
"oo")])
    Exp
Sit.Abs.Nat -> Int -> Int -> Doc -> Doc
prPrec Int
i Int
2 ([Doc] -> Doc
concatD [ShowS -> Doc
doc (String -> ShowS
showString String
"Nat")])
    Exp
Sit.Abs.Set -> Int -> Int -> Doc -> Doc
prPrec Int
i Int
2 ([Doc] -> Doc
concatD [ShowS -> Doc
doc (String -> ShowS
showString String
"Set")])
    Exp
Sit.Abs.Set1 -> Int -> Int -> Doc -> Doc
prPrec Int
i Int
2 ([Doc] -> Doc
concatD [ShowS -> Doc
doc (String -> ShowS
showString String
"Set1")])
    Exp
Sit.Abs.Set2 -> Int -> Int -> Doc -> Doc
prPrec Int
i Int
2 ([Doc] -> Doc
concatD [ShowS -> Doc
doc (String -> ShowS
showString String
"Set2")])
    Exp
Sit.Abs.Zero -> Int -> Int -> Doc -> Doc
prPrec Int
i Int
2 ([Doc] -> Doc
concatD [ShowS -> Doc
doc (String -> ShowS
showString String
"zero")])
    Exp
Sit.Abs.Suc -> Int -> Int -> Doc -> Doc
prPrec Int
i Int
2 ([Doc] -> Doc
concatD [ShowS -> Doc
doc (String -> ShowS
showString String
"suc")])
    Exp
Sit.Abs.Fix -> Int -> Int -> Doc -> Doc
prPrec Int
i Int
2 ([Doc] -> Doc
concatD [ShowS -> Doc
doc (String -> ShowS
showString String
"fix")])
    Exp
Sit.Abs.LZero -> Int -> Int -> Doc -> Doc
prPrec Int
i Int
2 ([Doc] -> Doc
concatD [ShowS -> Doc
doc (String -> ShowS
showString String
"lzero")])
    Exp
Sit.Abs.LSuc -> Int -> Int -> Doc -> Doc
prPrec Int
i Int
2 ([Doc] -> Doc
concatD [ShowS -> Doc
doc (String -> ShowS
showString String
"lsuc")])
    Exp
Sit.Abs.Size -> Int -> Int -> Doc -> Doc
prPrec Int
i Int
0 ([Doc] -> Doc
concatD [ShowS -> Doc
doc (String -> ShowS
showString String
"Size")])
    Sit.Abs.App Exp
exp1 Exp
exp2 -> Int -> Int -> Doc -> Doc
prPrec Int
i Int
1 ([Doc] -> Doc
concatD [Int -> Exp -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
1 Exp
exp1, Int -> Exp -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
2 Exp
exp2])
    Sit.Abs.Lam [IdU]
idus Exp
exp -> Int -> Int -> Doc -> Doc
prPrec Int
i Int
0 ([Doc] -> Doc
concatD [ShowS -> Doc
doc (String -> ShowS
showString String
"\\"), Int -> [IdU] -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 [IdU]
idus, ShowS -> Doc
doc (String -> ShowS
showString String
"->"), Int -> Exp -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 Exp
exp])
    Sit.Abs.Forall [Bind]
binds Exp
exp -> Int -> Int -> Doc -> Doc
prPrec Int
i Int
0 ([Doc] -> Doc
concatD [ShowS -> Doc
doc (String -> ShowS
showString String
"forall"), Int -> [Bind] -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 [Bind]
binds, ShowS -> Doc
doc (String -> ShowS
showString String
"->"), Int -> Exp -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 Exp
exp])
    Sit.Abs.Pi Exp
exp1 Exp
exp2 Exp
exp3 -> Int -> Int -> Doc -> Doc
prPrec Int
i Int
0 ([Doc] -> Doc
concatD [ShowS -> Doc
doc (String -> ShowS
showString String
"("), Int -> Exp -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 Exp
exp1, ShowS -> Doc
doc (String -> ShowS
showString String
":"), Int -> Exp -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 Exp
exp2, ShowS -> Doc
doc (String -> ShowS
showString String
")"), ShowS -> Doc
doc (String -> ShowS
showString String
"->"), Int -> Exp -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 Exp
exp3])
    Sit.Abs.Arrow Exp
exp1 Exp
exp2 -> Int -> Int -> Doc -> Doc
prPrec Int
i Int
0 ([Doc] -> Doc
concatD [Int -> Exp -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
1 Exp
exp1, ShowS -> Doc
doc (String -> ShowS
showString String
"->"), Int -> Exp -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 Exp
exp2])
    Sit.Abs.Case Exp
exp1 Exp
exp2 Exp
exp3 -> Int -> Int -> Doc -> Doc
prPrec Int
i Int
0 ([Doc] -> Doc
concatD [ShowS -> Doc
doc (String -> ShowS
showString String
"case"), Int -> Exp -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 Exp
exp1, ShowS -> Doc
doc (String -> ShowS
showString String
"return"), Int -> Exp -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 Exp
exp2, ShowS -> Doc
doc (String -> ShowS
showString String
"of"), Int -> Exp -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 Exp
exp3])
    Sit.Abs.Plus Exp
exp Integer
n -> Int -> Int -> Doc -> Doc
prPrec Int
i Int
0 ([Doc] -> Doc
concatD [Int -> Exp -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
1 Exp
exp, ShowS -> Doc
doc (String -> ShowS
showString String
"+"), Int -> Integer -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 Integer
n])
    Sit.Abs.ELam Exp
exp1 IdU
idu Exp
exp2 -> Int -> Int -> Doc -> Doc
prPrec Int
i Int
0 ([Doc] -> Doc
concatD [ShowS -> Doc
doc (String -> ShowS
showString String
"\\"), ShowS -> Doc
doc (String -> ShowS
showString String
"{"), ShowS -> Doc
doc (String -> ShowS
showString String
"("), ShowS -> Doc
doc (String -> ShowS
showString String
"zero"), ShowS -> Doc
doc (String -> ShowS
showString String
"_"), ShowS -> Doc
doc (String -> ShowS
showString String
")"), ShowS -> Doc
doc (String -> ShowS
showString String
"->"), Int -> Exp -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 Exp
exp1, ShowS -> Doc
doc (String -> ShowS
showString String
";"), ShowS -> Doc
doc (String -> ShowS
showString String
"("), ShowS -> Doc
doc (String -> ShowS
showString String
"suc"), ShowS -> Doc
doc (String -> ShowS
showString String
"_"), Int -> IdU -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 IdU
idu, ShowS -> Doc
doc (String -> ShowS
showString String
")"), ShowS -> Doc
doc (String -> ShowS
showString String
"->"), Int -> Exp -> Doc
forall a. Print a => Int -> a -> Doc
prt Int
0 Exp
exp2, ShowS -> Doc
doc (String -> ShowS
showString String
"}")])