{-# LANGUAGE DeriveFunctor     #-}
{-# LANGUAGE DeriveGeneric     #-}
{-# LANGUAGE FlexibleContexts  #-}
{-# LANGUAGE OverloadedStrings #-}

-- | AST
module A ( T (..)
         , (~>)
         , I (..), Sh (..)
         , C (..)
         , E (..)
         , Idiom (..)
         , Builtin (..)
         , ResVar (..)
         , prettyTyped
         , prettyC
         , rLi
         ) where

import           Control.DeepSeq   (NFData)
import qualified Data.IntMap       as IM
import           GHC.Generics      (Generic)
import           Nm
import           Prettyprinter     (Doc, Pretty (..), braces, brackets, colon, comma, encloseSep, flatAlt, group, hsep, lbrace, lbracket, parens, pipe, punctuate, rbrace, rbracket,
                                    tupled, (<+>))
import           Prettyprinter.Ext

instance Pretty (I a) where pretty :: forall ann. I a -> Doc ann
pretty=Int -> I a -> Doc ann
forall ann. Int -> I a -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps Int
0

instance PS (I a) where
    ps :: forall ann. Int -> I a -> Doc ann
ps Int
_ (Ix a
_ Int
i)        = Int -> Doc ann
forall ann. Int -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Int
i
    ps Int
_ (IVar a
_ Nm a
n)      = Nm a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Nm a -> Doc ann
pretty Nm a
n
    ps Int
d (StaPlus a
_ I a
i I a
j) = Bool -> Doc ann -> Doc ann
forall {ann}. Bool -> Doc ann -> Doc ann
parensp (Int
dInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>Int
5) (Int -> I a -> Doc ann
forall ann. Int -> I a -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps Int
6 I a
i Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"+" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Int -> I a -> Doc ann
forall ann. Int -> I a -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps Int
6 I a
j)
    ps Int
d (StaMul a
_ I a
i I a
j)  = Bool -> Doc ann -> Doc ann
forall {ann}. Bool -> Doc ann -> Doc ann
parensp (Int
dInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>Int
7) (Int -> I a -> Doc ann
forall ann. Int -> I a -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps Int
8 I a
i Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"*" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Int -> I a -> Doc ann
forall ann. Int -> I a -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps Int
8 I a
j)
    ps Int
_ (IEVar a
_ Nm a
n)     = Doc ann
"#" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Nm a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Nm a -> Doc ann
pretty Nm a
n

data I a = Ix { forall a. I a -> a
ia :: a, forall a. I a -> Int
ii :: !Int }
         | IVar { ia :: a, forall a. I a -> Nm a
ixn :: Nm a }
         | IEVar { ia :: a , forall a. I a -> Nm a
ie :: Nm a } -- existential
         | StaPlus { ia :: a, forall a. I a -> I a
ix0, forall a. I a -> I a
ix1 :: I a }
         | StaMul { ia :: a, ix0, ix1 :: I a }
         deriving ((forall a b. (a -> b) -> I a -> I b)
-> (forall a b. a -> I b -> I a) -> Functor I
forall a b. a -> I b -> I a
forall a b. (a -> b) -> I a -> I b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall a b. (a -> b) -> I a -> I b
fmap :: forall a b. (a -> b) -> I a -> I b
$c<$ :: forall a b. a -> I b -> I a
<$ :: forall a b. a -> I b -> I a
Functor, (forall x. I a -> Rep (I a) x)
-> (forall x. Rep (I a) x -> I a) -> Generic (I a)
forall x. Rep (I a) x -> I a
forall x. I a -> Rep (I a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (I a) x -> I a
forall a x. I a -> Rep (I a) x
$cfrom :: forall a x. I a -> Rep (I a) x
from :: forall x. I a -> Rep (I a) x
$cto :: forall a x. Rep (I a) x -> I a
to :: forall x. Rep (I a) x -> I a
Generic)

instance Show (I a) where
    show :: I a -> String
show = Doc Any -> String
forall a. Show a => a -> String
show (Doc Any -> String) -> (I a -> Doc Any) -> I a -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. I a -> Doc Any
forall a ann. Pretty a => a -> Doc ann
forall ann. I a -> Doc ann
pretty

data C = IsNum | IsOrd | IsEq
       | HasBits deriving ((forall x. C -> Rep C x) -> (forall x. Rep C x -> C) -> Generic C
forall x. Rep C x -> C
forall x. C -> Rep C x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. C -> Rep C x
from :: forall x. C -> Rep C x
$cto :: forall x. Rep C x -> C
to :: forall x. Rep C x -> C
Generic, C -> C -> Bool
(C -> C -> Bool) -> (C -> C -> Bool) -> Eq C
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: C -> C -> Bool
== :: C -> C -> Bool
$c/= :: C -> C -> Bool
/= :: C -> C -> Bool
Eq, Eq C
Eq C =>
(C -> C -> Ordering)
-> (C -> C -> Bool)
-> (C -> C -> Bool)
-> (C -> C -> Bool)
-> (C -> C -> Bool)
-> (C -> C -> C)
-> (C -> C -> C)
-> Ord C
C -> C -> Bool
C -> C -> Ordering
C -> C -> C
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: C -> C -> Ordering
compare :: C -> C -> Ordering
$c< :: C -> C -> Bool
< :: C -> C -> Bool
$c<= :: C -> C -> Bool
<= :: C -> C -> Bool
$c> :: C -> C -> Bool
> :: C -> C -> Bool
$c>= :: C -> C -> Bool
>= :: C -> C -> Bool
$cmax :: C -> C -> C
max :: C -> C -> C
$cmin :: C -> C -> C
min :: C -> C -> C
Ord)

instance NFData C where

instance Pretty C where
    pretty :: forall ann. C -> Doc ann
pretty C
IsNum   = Doc ann
"IsNum"
    pretty C
IsOrd   = Doc ann
"IsOrd"
    pretty C
IsEq    = Doc ann
"IsEq"
    pretty C
HasBits = Doc ann
"HasBits"

instance Show C where show :: C -> String
show=Doc Any -> String
forall a. Show a => a -> String
show(Doc Any -> String) -> (C -> Doc Any) -> C -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.C -> Doc Any
forall a ann. Pretty a => a -> Doc ann
forall ann. C -> Doc ann
pretty

tupledArr :: [Doc ann] -> Doc ann
tupledArr = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
group (Doc ann -> Doc ann)
-> ([Doc ann] -> Doc ann) -> [Doc ann] -> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc ann -> Doc ann -> Doc ann -> [Doc ann] -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann -> [Doc ann] -> Doc ann
encloseSep (Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
flatAlt Doc ann
"⟨ " Doc ann
"⟨") (Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
flatAlt Doc ann
" ⟩" Doc ann
"⟩") Doc ann
", "

data Sh a = Nil
          | SVar (Nm a)
          | Cons (I a) (Sh a)
          | Rev (Sh a)
          | Cat (Sh a) (Sh a)
          | Π (Sh a)
          deriving ((forall a b. (a -> b) -> Sh a -> Sh b)
-> (forall a b. a -> Sh b -> Sh a) -> Functor Sh
forall a b. a -> Sh b -> Sh a
forall a b. (a -> b) -> Sh a -> Sh b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall a b. (a -> b) -> Sh a -> Sh b
fmap :: forall a b. (a -> b) -> Sh a -> Sh b
$c<$ :: forall a b. a -> Sh b -> Sh a
<$ :: forall a b. a -> Sh b -> Sh a
Functor, (forall x. Sh a -> Rep (Sh a) x)
-> (forall x. Rep (Sh a) x -> Sh a) -> Generic (Sh a)
forall x. Rep (Sh a) x -> Sh a
forall x. Sh a -> Rep (Sh a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (Sh a) x -> Sh a
forall a x. Sh a -> Rep (Sh a) x
$cfrom :: forall a x. Sh a -> Rep (Sh a) x
from :: forall x. Sh a -> Rep (Sh a) x
$cto :: forall a x. Rep (Sh a) x -> Sh a
to :: forall x. Rep (Sh a) x -> Sh a
Generic)

infixr 8 `Cons`

instance Show (Sh a) where show :: Sh a -> String
show=Doc Any -> String
forall a. Show a => a -> String
show(Doc Any -> String) -> (Sh a -> Doc Any) -> Sh a -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Sh a -> Doc Any
forall a ann. Pretty a => a -> Doc ann
forall ann. Sh a -> Doc ann
pretty

instance Pretty (Sh a) where pretty :: forall ann. Sh a -> Doc ann
pretty=Int -> Sh a -> Doc ann
forall ann. Int -> Sh a -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps Int
0

unroll :: Sh a -> Maybe [I a]
unroll Sh a
Nil         = [I a] -> Maybe [I a]
forall a. a -> Maybe a
Just []
unroll (Cons I a
i Sh a
sh) = (I a
iI a -> [I a] -> [I a]
forall a. a -> [a] -> [a]
:)([I a] -> [I a]) -> Maybe [I a] -> Maybe [I a]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>Sh a -> Maybe [I a]
unroll Sh a
sh
unroll Sh a
_           = Maybe [I a]
forall a. Maybe a
Nothing

instance PS (Sh a) where
    ps :: forall ann. Int -> Sh a -> Doc ann
ps Int
_ (SVar Nm a
n)    = Nm a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Nm a -> Doc ann
pretty Nm a
n
    ps Int
_ sh :: Sh a
sh@Cons{}   | Just [I a]
is <- Sh a -> Maybe [I a]
forall {a}. Sh a -> Maybe [I a]
unroll Sh a
sh = Doc ann -> [Doc ann] -> Doc ann
forall ann. Doc ann -> [Doc ann] -> Doc ann
tupledBy Doc ann
" × " (I a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. I a -> Doc ann
pretty (I a -> Doc ann) -> [I a] -> [Doc ann]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [I a]
is)
    ps Int
d (Cons I a
i Sh a
sh) = Bool -> Doc ann -> Doc ann
forall {ann}. Bool -> Doc ann -> Doc ann
parensp (Int
dInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>Int
6) (I a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. I a -> Doc ann
pretty I a
i Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"`Cons`" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Sh a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Sh a -> Doc ann
pretty Sh a
sh)
    ps Int
_ Sh a
Nil         = Doc ann
"Nil"
    ps Int
d (Cat Sh a
s Sh a
s')  = Bool -> Doc ann -> Doc ann
forall {ann}. Bool -> Doc ann -> Doc ann
parensp (Int
dInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>Int
5) (Int -> Sh a -> Doc ann
forall ann. Int -> Sh a -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps Int
6 Sh a
s Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"⧺" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Int -> Sh a -> Doc ann
forall ann. Int -> Sh a -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps Int
6 Sh a
s')
    ps Int
d (Rev Sh a
s)     = Bool -> Doc ann -> Doc ann
forall {ann}. Bool -> Doc ann -> Doc ann
parensp (Int
dInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>Int
appPrec) (Doc ann
"rev" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Int -> Sh a -> Doc ann
forall ann. Int -> Sh a -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps (Int
appPrecInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) Sh a
s)
    ps Int
d (Π Sh a
s)       = Bool -> Doc ann -> Doc ann
forall {ann}. Bool -> Doc ann -> Doc ann
parensp (Int
dInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>Int
appPrec) (Doc ann
"Π" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Int -> Sh a -> Doc ann
forall ann. Int -> Sh a -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps (Int
appPrecInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) Sh a
s)

appPrec :: Int
appPrec=Int
10

infixr 0 ~>
~> :: T a -> T a -> T a
(~>) = T a -> T a -> T a
forall a. T a -> T a -> T a
Arrow

data T a = Arr (Sh a) (T a)
         | F -- | double
         | I -- | int
         | B -- | bool
         | Li (I a)
         | TVar (Nm a) -- | Kind \(*\)
         | Arrow (T a) (T a)
         | P [T a]
         | Ρ (TyNm a) (IM.IntMap (T a))
         deriving ((forall a b. (a -> b) -> T a -> T b)
-> (forall a b. a -> T b -> T a) -> Functor T
forall a b. a -> T b -> T a
forall a b. (a -> b) -> T a -> T b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall a b. (a -> b) -> T a -> T b
fmap :: forall a b. (a -> b) -> T a -> T b
$c<$ :: forall a b. a -> T b -> T a
<$ :: forall a b. a -> T b -> T a
Functor, (forall x. T a -> Rep (T a) x)
-> (forall x. Rep (T a) x -> T a) -> Generic (T a)
forall x. Rep (T a) x -> T a
forall x. T a -> Rep (T a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (T a) x -> T a
forall a x. T a -> Rep (T a) x
$cfrom :: forall a x. T a -> Rep (T a) x
from :: forall x. T a -> Rep (T a) x
$cto :: forall a x. Rep (T a) x -> T a
to :: forall x. Rep (T a) x -> T a
Generic)

instance Show (T a) where show :: T a -> String
show=Doc Any -> String
forall a. Show a => a -> String
show(Doc Any -> String) -> (T a -> Doc Any) -> T a -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.T a -> Doc Any
forall a ann. Pretty a => a -> Doc ann
forall ann. T a -> Doc ann
pretty

instance Pretty (T a) where pretty :: forall ann. T a -> Doc ann
pretty=Int -> T a -> Doc ann
forall ann. Int -> T a -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps Int
0

instance PS (T a) where
    ps :: forall ann. Int -> T a -> Doc ann
ps Int
d (Arr (I a
i `Cons` Sh a
Nil) T a
t) = Bool -> Doc ann -> Doc ann
forall {ann}. Bool -> Doc ann -> Doc ann
parensp (Int
dInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>Int
appPrec) (Doc ann
"Vec" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Int -> I a -> Doc ann
forall ann. Int -> I a -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps (Int
appPrecInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) I a
i Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Int -> T a -> Doc ann
forall ann. Int -> T a -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps (Int
appPrecInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) T a
t)
    ps Int
d (Arr Sh a
i T a
t)              = Bool -> Doc ann -> Doc ann
forall {ann}. Bool -> Doc ann -> Doc ann
parensp (Int
dInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>Int
appPrec) (Doc ann
"Arr" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Int -> Sh a -> Doc ann
forall ann. Int -> Sh a -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps (Int
appPrecInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) Sh a
i Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Int -> T a -> Doc ann
forall ann. Int -> T a -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps (Int
appPrecInt -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) T a
t)
    ps Int
_ T a
F                      = Doc ann
"float"
    ps Int
_ T a
I                      = Doc ann
"int"
    ps Int
_ (Li I a
i)                 = Doc ann
"int" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (I a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. I a -> Doc ann
pretty I a
i)
    ps Int
_ T a
B                      = Doc ann
"bool"
    ps Int
_ (TVar Nm a
n)               = Nm a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Nm a -> Doc ann
pretty Nm a
n
    ps Int
d (Arrow T a
t0 T a
t1)          = Bool -> Doc ann -> Doc ann
forall {ann}. Bool -> Doc ann -> Doc ann
parensp (Int
dInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>Int
0) (Int -> T a -> Doc ann
forall ann. Int -> T a -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps Int
1 T a
t0 Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"→" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Int -> T a -> Doc ann
forall ann. Int -> T a -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps Int
0 T a
t1)
    ps Int
_ (P [T a]
ts)                 = Doc ann -> [Doc ann] -> Doc ann
forall ann. Doc ann -> [Doc ann] -> Doc ann
tupledBy Doc ann
" * " (T a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. T a -> Doc ann
pretty (T a -> Doc ann) -> [T a] -> [Doc ann]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [T a]
ts)
    ps Int
_ (Ρ Nm a
n IntMap (T a)
fs)               = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces (Nm a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Nm a -> Doc ann
pretty Nm a
n Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
forall ann. Doc ann
pipe Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> [(Int, T a)] -> Doc ann
forall a ann. [(Int, T a)] -> Doc ann
prettyFields (IntMap (T a) -> [(Int, T a)]
forall a. IntMap a -> [(Int, a)]
IM.toList IntMap (T a)
fs))

rLi :: T a -> T a
rLi :: forall a. T a -> T a
rLi Li{}          = T a
forall a. T a
I
rLi (Arrow T a
t0 T a
t1) = T a -> T a -> T a
forall a. T a -> T a -> T a
Arrow (T a -> T a
forall a. T a -> T a
rLi T a
t0) (T a -> T a
forall a. T a -> T a
rLi T a
t1)
rLi (Arr Sh a
sh T a
t)    = Sh a -> T a -> T a
forall a. Sh a -> T a -> T a
Arr Sh a
sh (T a -> T a
forall a. T a -> T a
rLi T a
t)
rLi (Ρ TyNm a
n IntMap (T a)
ts)      = TyNm a -> IntMap (T a) -> T a
forall a. TyNm a -> IntMap (T a) -> T a
Ρ TyNm a
n (T a -> T a
forall a. T a -> T a
rLi (T a -> T a) -> IntMap (T a) -> IntMap (T a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> IntMap (T a)
ts)
rLi (P [T a]
ts)        = [T a] -> T a
forall a. [T a] -> T a
P (T a -> T a
forall a. T a -> T a
rLi (T a -> T a) -> [T a] -> [T a]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [T a]
ts)
rLi T a
t             = T a
t

prettyFields :: [(Int, T a)] -> Doc ann
prettyFields :: forall a ann. [(Int, T a)] -> Doc ann
prettyFields = [Doc ann] -> Doc ann
forall a. Monoid a => [a] -> a
mconcat ([Doc ann] -> Doc ann)
-> ([(Int, T a)] -> [Doc ann]) -> [(Int, T a)] -> Doc ann
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Doc ann -> [Doc ann] -> [Doc ann]
forall ann. Doc ann -> [Doc ann] -> [Doc ann]
punctuate Doc ann
"," ([Doc ann] -> [Doc ann])
-> ([(Int, T a)] -> [Doc ann]) -> [(Int, T a)] -> [Doc ann]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((Int, T a) -> Doc ann) -> [(Int, T a)] -> [Doc ann]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Int, T a) -> Doc ann
forall {a} {a} {ann}. (Pretty a, Pretty a) => (a, a) -> Doc ann
g where g :: (a, a) -> Doc ann
g (a
i, a
t) = a -> Doc ann
forall ann. a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty a
i Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
":" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> a -> Doc ann
forall ann. a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty a
t

prettyRank :: (Int, Maybe [Int]) -> Doc ann
prettyRank :: forall ann. (Int, Maybe [Int]) -> Doc ann
prettyRank (Int
i, Maybe [Int]
Nothing) = Int -> Doc ann
forall ann. Int -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Int
i
prettyRank (Int
i, Just [Int]
as) = Int -> Doc ann
forall ann. Int -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Int
i Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"∘" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann -> Doc ann -> [Doc ann] -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann -> [Doc ann] -> Doc ann
encloseSep Doc ann
forall ann. Doc ann
lbracket Doc ann
forall ann. Doc ann
rbracket Doc ann
forall ann. Doc ann
comma (Int -> Doc ann
forall ann. Int -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty(Int -> Doc ann) -> [Int] -> [Doc ann]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>[Int]
as)

instance Pretty Builtin where
    pretty :: forall ann. Builtin -> Doc ann
pretty Builtin
Plus      = Doc ann
"+"
    pretty Builtin
Fold      = Doc ann
"/"
    pretty Builtin
FoldS     = Doc ann
"/ₒ"
    pretty Builtin
FoldA     = Doc ann
"/*"
    pretty Builtin
Times     = Doc ann
"*"
    pretty Builtin
FRange    = Doc ann
"𝒻"
    pretty Builtin
IRange    = Doc ann
"⍳"
    pretty Builtin
Floor     = Doc ann
"⌊"
    pretty Builtin
Minus     = Doc ann
"-"
    pretty Builtin
Max       = Doc ann
"⋉"
    pretty Builtin
Min       = Doc ann
"⋊"
    pretty Builtin
Map       = Doc ann
"'"
    pretty Builtin
Zip       = Doc ann
"`"
    pretty Builtin
Div       = Doc ann
"%"
    pretty Builtin
IntExp    = Doc ann
"^"
    pretty Builtin
Exp       = Doc ann
"**"
    pretty Builtin
ItoF      = Doc ann
"ℝ"
    pretty Builtin
Neg       = Doc ann
"_"
    pretty Builtin
Sqrt      = Doc ann
"√"
    pretty Builtin
Log       = Doc ann
"_."
    pretty Builtin
Re        = Doc ann
"re:"
    pretty Builtin
Size      = Doc ann
":"
    pretty (Rank [(Int, Maybe [Int])]
as) = Doc ann
"`" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann -> Doc ann -> Doc ann -> [Doc ann] -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann -> [Doc ann] -> Doc ann
encloseSep Doc ann
forall ann. Doc ann
lbrace Doc ann
forall ann. Doc ann
rbrace Doc ann
forall ann. Doc ann
comma ((Int, Maybe [Int]) -> Doc ann
forall ann. (Int, Maybe [Int]) -> Doc ann
prettyRank((Int, Maybe [Int]) -> Doc ann)
-> [(Int, Maybe [Int])] -> [Doc ann]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>[(Int, Maybe [Int])]
as)
    pretty Builtin
IDiv      = Doc ann
"/."
    pretty Builtin
Scan      = Doc ann
"Λ"
    pretty Builtin
ScanS     = Doc ann
"Λₒ"
    pretty (DI Int
i)    = Doc ann
"\\`" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Int -> Doc ann
forall ann. Int -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Int
i
    pretty (Conv [Int]
ns) = Doc ann
"⨳" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann -> Doc ann -> [Doc ann] -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann -> [Doc ann] -> Doc ann
encloseSep Doc ann
forall ann. Doc ann
lbrace Doc ann
forall ann. Doc ann
rbrace Doc ann
forall ann. Doc ann
comma (Int -> Doc ann
forall ann. Int -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty(Int -> Doc ann) -> [Int] -> [Doc ann]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>[Int]
ns)
    pretty (TAt Int
i)   = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Doc ann
"->" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Int -> Doc ann
forall ann. Int -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Int
i)
    pretty Builtin
Gen       = Doc ann
"gen."
    pretty Builtin
Last      = Doc ann
"}."
    pretty Builtin
LastM     = Doc ann
"}.?"
    pretty Builtin
Head      = Doc ann
"{."
    pretty Builtin
HeadM     = Doc ann
"{.?"
    pretty Builtin
Tail      = Doc ann
"{:"
    pretty Builtin
TailM     = Doc ann
"{:?"
    pretty Builtin
Init      = Doc ann
"}:"
    pretty Builtin
InitM     = Doc ann
"}:?"
    pretty Builtin
ConsE     = Doc ann
"⊲"
    pretty Builtin
Snoc      = Doc ann
"⊳"
    pretty Builtin
Mul       = Doc ann
"%."
    pretty Builtin
VMul      = Doc ann
"%:"
    pretty Builtin
Iter      = Doc ann
"^:"
    pretty Builtin
Succ      = Doc ann
"\\~"
    pretty Builtin
T         = Doc ann
"|:"
    pretty Builtin
Fib       = Doc ann
"𝓕"
    pretty Builtin
Dim       = Doc ann
"𝓉"
    pretty Builtin
Sin       = Doc ann
"sin."
    pretty Builtin
Cos       = Doc ann
"cos."
    pretty Builtin
Tan       = Doc ann
"tan."
    pretty Builtin
Gte       = Doc ann
"≥"
    pretty Builtin
Gt        = Doc ann
">"
    pretty Builtin
Lt        = Doc ann
"<"
    pretty Builtin
Eq        = Doc ann
"="
    pretty Builtin
Neq       = Doc ann
"≠"
    pretty Builtin
Lte       = Doc ann
"≤"
    pretty Builtin
CatE      = Doc ann
"⧺"
    pretty Builtin
R         = Doc ann
"𝔯"
    pretty Builtin
Rot       = Doc ann
"⊖"
    pretty Builtin
Cyc       = Doc ann
"⊙"
    pretty Builtin
A1        = Doc ann
"˙"
    pretty Builtin
Even      = Doc ann
"even."
    pretty Builtin
Odd       = Doc ann
"odd."
    pretty Builtin
Mod       = Doc ann
"mod"
    pretty Builtin
IOf       = Doc ann
"@."
    pretty Builtin
Filt      = Doc ann
"§"
    pretty Builtin
Abs       = Doc ann
"abs."
    pretty Builtin
Di        = Doc ann
"di."
    pretty Builtin
RevE      = Doc ann
"~"
    pretty Builtin
Flat      = Doc ann
"♭"
    pretty Builtin
AddDim    = Doc ann
"♮"
    pretty Builtin
Xor       = Doc ann
"⊻"
    pretty Builtin
And       = Doc ann
"∧"
    pretty Builtin
Or        = Doc ann
"∨"
    pretty Builtin
N         = Doc ann
"¬"
    pretty Builtin
Ices      = Doc ann
"℘"
    pretty Builtin
Eye       = Doc ann
"👁️"
    pretty Builtin
Sr        = Doc ann
">>"
    pretty Builtin
Sl        = Doc ann
"<<"
    pretty Builtin
C         = Doc ann
"∴"

data Builtin = Plus | Minus | Times | Div | IntExp | Exp | Log
             | Eq | Neq | Gt | Lt | Gte | Lte | CatE | IDiv | Mod
             | Max | Min | Neg | Sqrt | T | Di
             | Flat | AddDim | Ices | Filt | Eye
             | IRange | FRange
             | Map | FoldA | Zip
             | Rank [(Int, Maybe [Int])]
             | Fold | FoldS | Foldl | Floor | ItoF | Iter
             | Scan | ScanS | Size | Dim | Re | Gen | Fib | Succ
             | DI !Int -- dyadic infix
             | Conv [Int] | TAt !Int | Last | LastM | ConsE | Snoc
             | Mul | VMul | Outer | R | Head | HeadM | Tail | Init | RevE
             | TailM | InitM
             | Sin | Cos | Rot | Tan | Cyc | A1 | Even | Odd | IOf | Abs
             | And | Or | Xor | N | Sr | Sl | C
             deriving ((forall x. Builtin -> Rep Builtin x)
-> (forall x. Rep Builtin x -> Builtin) -> Generic Builtin
forall x. Rep Builtin x -> Builtin
forall x. Builtin -> Rep Builtin x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Builtin -> Rep Builtin x
from :: forall x. Builtin -> Rep Builtin x
$cto :: forall x. Rep Builtin x -> Builtin
to :: forall x. Rep Builtin x -> Builtin
Generic)
             -- TODO: (feuilleter, stagger, ...) reshape...?

ptName :: Nm (T a) -> Doc ann
ptName :: forall a ann. Nm (T a) -> Doc ann
ptName n :: Nm (T a)
n@(Nm Text
_ U
_ T a
t) = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Nm (T a) -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Nm (T a) -> Doc ann
pretty Nm (T a)
n Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
":" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> T a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. T a -> Doc ann
pretty T a
t)

prettyC :: (T (), [(Nm a, C)]) -> Doc ann
prettyC :: forall a ann. (T (), [(Nm a, C)]) -> Doc ann
prettyC (T ()
t, []) = T () -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. T () -> Doc ann
pretty T ()
t
prettyC (T ()
t, [(Nm a, C)]
cs) = [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
tupled ((Nm a, C) -> Doc ann
forall {a} {a} {ann}. (Pretty a, Pretty a) => (a, a) -> Doc ann
pc((Nm a, C) -> Doc ann) -> [(Nm a, C)] -> [Doc ann]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>[(Nm a, C)]
cs) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
":=>" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> T () -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. T () -> Doc ann
pretty T ()
t
    where pc :: (a, a) -> Doc ann
pc (a
n, a
c) = a -> Doc ann
forall ann. a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty a
c Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> a -> Doc ann
forall ann. a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty a
n

-- TODO: constraints
prettyTyped :: E (T a) -> Doc ann
prettyTyped :: forall a ann. E (T a) -> Doc ann
prettyTyped (Var T a
t Nm (T a)
n)                                             = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Nm (T a) -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Nm (T a) -> Doc ann
pretty Nm (T a)
n Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
":" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> T a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. T a -> Doc ann
pretty T a
t)
prettyTyped (Builtin T a
t Builtin
b)                                         = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Builtin -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Builtin -> Doc ann
pretty Builtin
b Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
":" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> T a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. T a -> Doc ann
pretty T a
t)
prettyTyped (ILit T a
t Integer
n)                                            = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Integer -> Doc ann
forall ann. Integer -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Integer
n Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
":" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> T a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. T a -> Doc ann
pretty T a
t)
prettyTyped (FLit T a
t Double
x)                                            = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Double -> Doc ann
forall ann. Double -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Double
x Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
":" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> T a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. T a -> Doc ann
pretty T a
t)
prettyTyped (BLit T a
t Bool
True)                                         = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Doc ann
"#t" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
forall ann. Doc ann
colon Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> T a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. T a -> Doc ann
pretty T a
t)
prettyTyped (BLit T a
t Bool
False)                                        = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Doc ann
"#f" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
forall ann. Doc ann
colon Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> T a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. T a -> Doc ann
pretty T a
t)
prettyTyped (Cond T a
t E (T a)
p E (T a)
e0 E (T a)
e1)                                      = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Doc ann
"?" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E (T a) -> Doc ann
forall a ann. E (T a) -> Doc ann
prettyTyped E (T a)
p Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
",." Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E (T a) -> Doc ann
forall a ann. E (T a) -> Doc ann
prettyTyped E (T a)
e0 Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E (T a) -> Doc ann
forall a ann. E (T a) -> Doc ann
prettyTyped E (T a)
e1) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
forall ann. Doc ann
colon Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> T a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. T a -> Doc ann
pretty T a
t
prettyTyped (Lam T a
_ n :: Nm (T a)
n@(Nm Text
_ U
_ T a
xt) E (T a)
e)                               = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Doc ann
"λ" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Nm (T a) -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Nm (T a) -> Doc ann
pretty Nm (T a)
n Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
":" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> T a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. T a -> Doc ann
pretty T a
xt) Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"." Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E (T a) -> Doc ann
forall a ann. E (T a) -> Doc ann
prettyTyped E (T a)
e)
prettyTyped (EApp T a
_ (EApp T a
_ (EApp T a
_ (Builtin T a
_ Builtin
FoldS) E (T a)
e0) E (T a)
e1) E (T a)
e2) = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (E (T a) -> Doc ann
forall a ann. E (T a) -> Doc ann
prettyTyped E (T a)
e0 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"/ₒ" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E (T a) -> Doc ann
forall a ann. E (T a) -> Doc ann
prettyTyped E (T a)
e1 Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E (T a) -> Doc ann
forall a ann. E (T a) -> Doc ann
prettyTyped E (T a)
e2)
prettyTyped (EApp T a
_ (EApp T a
_ (EApp T a
_ (Builtin T a
_ Builtin
FoldA) E (T a)
e0) E (T a)
e1) E (T a)
e2) = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (E (T a) -> Doc ann
forall a ann. E (T a) -> Doc ann
prettyTyped E (T a)
e0 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"/*" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E (T a) -> Doc ann
forall a ann. E (T a) -> Doc ann
prettyTyped E (T a)
e1 Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E (T a) -> Doc ann
forall a ann. E (T a) -> Doc ann
prettyTyped E (T a)
e2)
prettyTyped (EApp T a
_ (EApp T a
_ (EApp T a
_ (Builtin T a
_ Builtin
Foldl) E (T a)
e0) E (T a)
e1) E (T a)
e2) = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (E (T a) -> Doc ann
forall a ann. E (T a) -> Doc ann
prettyTyped E (T a)
e0 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"/l" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E (T a) -> Doc ann
forall a ann. E (T a) -> Doc ann
prettyTyped E (T a)
e1 Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E (T a) -> Doc ann
forall a ann. E (T a) -> Doc ann
prettyTyped E (T a)
e2)
prettyTyped (EApp T a
t (EApp T a
_ (EApp T a
_ (Builtin T a
_ Builtin
Outer) E (T a)
e0) E (T a)
e1) E (T a)
e2) = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (E (T a) -> Doc ann
forall a ann. E (T a) -> Doc ann
prettyTyped E (T a)
e1 Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E (T a) -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E (T a) -> Doc ann
pretty E (T a)
e0 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"⊗" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E (T a) -> Doc ann
forall a ann. E (T a) -> Doc ann
prettyTyped E (T a)
e2 Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
":" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> T a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. T a -> Doc ann
pretty T a
t)
prettyTyped (EApp T a
_ e0 :: E (T a)
e0@(Builtin T a
_ Builtin
op) E (T a)
e1) | Builtin -> Bool
isBinOp Builtin
op            = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (E (T a) -> Doc ann
forall a ann. E (T a) -> Doc ann
prettyTyped E (T a)
e1 Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E (T a) -> Doc ann
forall a ann. E (T a) -> Doc ann
prettyTyped E (T a)
e0)
prettyTyped (EApp T a
_ E (T a)
e0 E (T a)
e1)                                        = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (E (T a) -> Doc ann
forall a ann. E (T a) -> Doc ann
prettyTyped E (T a)
e0 Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E (T a) -> Doc ann
forall a ann. E (T a) -> Doc ann
prettyTyped E (T a)
e1)
prettyTyped (Let T a
t (Nm (T a)
n, E (T a)
e) E (T a)
e')                                     = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces (Nm (T a) -> Doc ann
forall a ann. Nm (T a) -> Doc ann
ptName Nm (T a)
n Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"←" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E (T a) -> Doc ann
forall a ann. E (T a) -> Doc ann
prettyTyped E (T a)
e Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
";" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E (T a) -> Doc ann
forall a ann. E (T a) -> Doc ann
prettyTyped E (T a)
e') Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> T a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. T a -> Doc ann
pretty T a
t)
prettyTyped (LLet T a
t (Nm (T a)
n, E (T a)
e) E (T a)
e')                                    = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces (Nm (T a) -> Doc ann
forall a ann. Nm (T a) -> Doc ann
ptName Nm (T a)
n Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"⟜" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E (T a) -> Doc ann
forall a ann. E (T a) -> Doc ann
prettyTyped E (T a)
e Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
";" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E (T a) -> Doc ann
forall a ann. E (T a) -> Doc ann
prettyTyped E (T a)
e') Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> T a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. T a -> Doc ann
pretty T a
t)
prettyTyped (Def T a
t (Nm (T a)
n, E (T a)
e) E (T a)
e')                                     = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces (Nm (T a) -> Doc ann
forall a ann. Nm (T a) -> Doc ann
ptName Nm (T a)
n Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"⇐" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E (T a) -> Doc ann
forall a ann. E (T a) -> Doc ann
prettyTyped E (T a)
e Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
";" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E (T a) -> Doc ann
forall a ann. E (T a) -> Doc ann
prettyTyped E (T a)
e') Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> T a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. T a -> Doc ann
pretty T a
t)
prettyTyped (Tup T a
_ [E (T a)]
es)                                            = [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
tupled (E (T a) -> Doc ann
forall a ann. E (T a) -> Doc ann
prettyTyped (E (T a) -> Doc ann) -> [E (T a)] -> [Doc ann]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [E (T a)]
es)
prettyTyped e :: E (T a)
e@(ALit T a
t [E (T a)]
_)                                          = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (E (T a) -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E (T a) -> Doc ann
pretty E (T a)
e Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
":" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> T a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. T a -> Doc ann
pretty T a
t)

mPrec :: Builtin -> Maybe Int
mPrec :: Builtin -> Maybe Int
mPrec Builtin
Plus   = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
6
mPrec Builtin
Minus  = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
6
mPrec Builtin
Times  = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
7
mPrec Builtin
Div    = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
7
mPrec Builtin
IDiv   = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
7
mPrec Builtin
Exp    = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
8
mPrec Builtin
IntExp = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
8
mPrec Builtin
Mod    = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
7
mPrec Builtin
Succ   = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
9
mPrec Builtin
Fold   = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
9
mPrec Builtin
C      = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
9
mPrec Builtin
Ices   = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
6
mPrec Builtin
Filt   = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
6
mPrec Builtin
Map    = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
5
mPrec Builtin
ConsE  = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
4
mPrec Builtin
Snoc   = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
4
mPrec Builtin
CatE   = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
5
mPrec Builtin
Sr     = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
8
mPrec Builtin
Sl     = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
8
mPrec Builtin
Xor    = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
6
mPrec Builtin
And    = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
3
mPrec Builtin
Or     = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
2
mPrec Builtin
Eq     = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
4
mPrec Builtin
Neq    = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
4
mPrec Builtin
Gt     = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
4
mPrec Builtin
Lt     = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
4
mPrec Builtin
Gte    = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
4
mPrec Builtin
Lte    = Int -> Maybe Int
forall a. a -> Maybe a
Just Int
4
mPrec Builtin
_      = Maybe Int
forall a. Maybe a
Nothing

isBinOp :: Builtin -> Bool
isBinOp :: Builtin -> Bool
isBinOp Builtin
Plus   = Bool
True
isBinOp Builtin
Minus  = Bool
True
isBinOp Builtin
Times  = Bool
True
isBinOp Builtin
Div    = Bool
True
isBinOp Builtin
IDiv   = Bool
True
isBinOp Builtin
Exp    = Bool
True
isBinOp Builtin
IntExp = Bool
True
isBinOp DI{}   = Bool
True
isBinOp Conv{} = Bool
True
isBinOp Builtin
Mul    = Bool
True
isBinOp Builtin
VMul   = Bool
True
isBinOp Builtin
Rot    = Bool
True
isBinOp Builtin
ConsE  = Bool
True
isBinOp Builtin
Snoc   = Bool
True
isBinOp Builtin
Scan   = Bool
True
isBinOp Builtin
Fold   = Bool
True
isBinOp Builtin
Map    = Bool
True
isBinOp Builtin
Cyc    = Bool
True
isBinOp Builtin
A1     = Bool
True
isBinOp Builtin
Mod    = Bool
True
isBinOp Builtin
IOf    = Bool
True
isBinOp Builtin
And    = Bool
True
isBinOp Builtin
Or     = Bool
True
isBinOp Builtin
Xor    = Bool
True
isBinOp Builtin
Filt   = Bool
True
isBinOp Builtin
Ices   = Bool
True
isBinOp Builtin
Sr     = Bool
True
isBinOp Builtin
Sl     = Bool
True
isBinOp Builtin
_      = Bool
False

instance Pretty (E a) where pretty :: forall ann. E a -> Doc ann
pretty=Int -> E a -> Doc ann
forall ann. Int -> E a -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps Int
0

instance PS (E a) where
    ps :: forall ann. Int -> E a -> Doc ann
ps Int
d (Lam a
_ Nm a
n E a
e)                                              = Bool -> Doc ann -> Doc ann
forall {ann}. Bool -> Doc ann -> Doc ann
parensp (Int
dInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>Int
1) (Doc ann
"λ" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Nm a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Nm a -> Doc ann
pretty Nm a
n Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"." Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Int -> E a -> Doc ann
forall ann. Int -> E a -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps Int
2 E a
e)
    ps Int
_ (Var a
_ Nm a
n)                                                = Nm a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Nm a -> Doc ann
pretty Nm a
n
    ps Int
_ (Builtin a
_ Builtin
op) | Builtin -> Bool
isBinOp Builtin
op                              = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Builtin -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Builtin -> Doc ann
pretty Builtin
op)
    ps Int
_ (Builtin a
_ Builtin
b)                                            = Builtin -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Builtin -> Doc ann
pretty Builtin
b
    ps Int
d (EApp a
_ (Builtin a
_ (TAt Int
i)) E a
e)                           = Bool -> Doc ann -> Doc ann
forall {ann}. Bool -> Doc ann -> Doc ann
parensp (Int
dInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>Int
9) (Int -> E a -> Doc ann
forall ann. Int -> E a -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps Int
10 E a
e Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"->" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Int -> Doc ann
forall ann. Int -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Int
i)
    ps Int
_ (EApp a
_ (Builtin a
_ Builtin
op) E a
e0) | Builtin -> Bool
isBinOp Builtin
op                  = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (E a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E a -> Doc ann
pretty E a
e0 Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Builtin -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Builtin -> Doc ann
pretty Builtin
op)
    ps Int
d (EApp a
_ (EApp a
_ (Builtin a
_ Builtin
op) E a
e0) E a
e1) | Just Int
d' <- Builtin -> Maybe Int
mPrec Builtin
op = Bool -> Doc ann -> Doc ann
forall {ann}. Bool -> Doc ann -> Doc ann
parensp (Int
dInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>Int
d') (Int -> E a -> Doc ann
forall ann. Int -> E a -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps (Int
d'Int -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) E a
e0 Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Builtin -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Builtin -> Doc ann
pretty Builtin
op Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Int -> E a -> Doc ann
forall ann. Int -> E a -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps (Int
d'Int -> Int -> Int
forall a. Num a => a -> a -> a
+Int
1) E a
e1)
    ps Int
_ (EApp a
_ (EApp a
_ (Builtin a
_ Builtin
op) E a
e0) E a
e1) | Builtin -> Bool
isBinOp Builtin
op      = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Int -> E a -> Doc ann
forall ann. Int -> E a -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps Int
10 E a
e0 Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Builtin -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Builtin -> Doc ann
pretty Builtin
op Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Int -> E a -> Doc ann
forall ann. Int -> E a -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps Int
10 E a
e1)
    ps Int
_ (EApp a
_ (EApp a
_ (EApp a
_ (Builtin a
_ Builtin
Iter) E a
e0) E a
e1) E a
e2)     = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Int -> E a -> Doc ann
forall ann. Int -> E a -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps Int
10 E a
e0 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"^:" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Int -> E a -> Doc ann
forall ann. Int -> E a -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps Int
10 E a
e1 Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Int -> E a -> Doc ann
forall ann. Int -> E a -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps Int
11 E a
e2)
    ps Int
_ (EApp a
_ (EApp a
_ (EApp a
_ (Builtin a
_ Builtin
FoldS) E a
e0) E a
e1) E a
e2)    = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (E a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E a -> Doc ann
pretty E a
e0 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"/ₒ" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E a -> Doc ann
pretty E a
e1 Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E a -> Doc ann
pretty E a
e2)
    ps Int
_ (EApp a
_ (EApp a
_ (EApp a
_ (Builtin a
_ Builtin
Foldl) E a
e0) E a
e1) E a
e2)    = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (E a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E a -> Doc ann
pretty E a
e0 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"/l" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E a -> Doc ann
pretty E a
e1 Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E a -> Doc ann
pretty E a
e2)
    ps Int
_ (EApp a
_ (EApp a
_ (EApp a
_ (Builtin a
_ Builtin
FoldA) E a
e0) E a
e1) E a
e2)    = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (E a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E a -> Doc ann
pretty E a
e0 Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
"/*" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E a -> Doc ann
pretty E a
e1 Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E a -> Doc ann
pretty E a
e2)
    ps Int
_ (EApp a
_ (EApp a
_ (EApp a
_ (Builtin a
_ Builtin
ScanS) E a
e0) E a
e1) E a
e2)    = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (E a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E a -> Doc ann
pretty E a
e0 Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"Λₒ" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E a -> Doc ann
pretty E a
e1 Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E a -> Doc ann
pretty E a
e2)
    ps Int
_ (EApp a
_ (EApp a
_ (EApp a
_ (Builtin a
_ Builtin
Zip) E a
e0) E a
e1) E a
e2)      = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (E a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E a -> Doc ann
pretty E a
e0 Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"`" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E a -> Doc ann
pretty E a
e1 Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E a -> Doc ann
pretty E a
e2)
    ps Int
_ (EApp a
_ (EApp a
_ (EApp a
_ (Builtin a
_ Builtin
Outer) E a
e0) E a
e1) E a
e2)    = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (E a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E a -> Doc ann
pretty E a
e1 Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Int -> E a -> Doc ann
forall ann. Int -> E a -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps Int
10 E a
e0 Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"⊗" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E a -> Doc ann
pretty E a
e2)
    ps Int
_ (EApp a
_ (EApp a
_ (Builtin a
_ op :: Builtin
op@Rank{}) E a
e0) E a
e1)            = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (E a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E a -> Doc ann
pretty E a
e0 Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Builtin -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Builtin -> Doc ann
pretty Builtin
op Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E a -> Doc ann
pretty E a
e1)
    ps Int
_ (EApp a
_ (EApp a
_ (Builtin a
_ op :: Builtin
op@Conv{}) E a
e0) E a
e1)            = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (E a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E a -> Doc ann
pretty E a
e0 Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Builtin -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Builtin -> Doc ann
pretty Builtin
op Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E a -> Doc ann
pretty E a
e1)
    ps Int
_ (EApp a
_ (EApp a
_ (Builtin a
_ (DI Int
i)) E a
e0) E a
e1)               = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (E a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E a -> Doc ann
pretty E a
e0 Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"\\`" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Int -> Doc ann
forall ann. Int -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Int
i Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E a -> Doc ann
pretty E a
e1)
    ps Int
_ (EApp a
_ (EApp a
_ (Builtin a
_ Builtin
Succ) E a
e0) E a
e1)                 = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (E a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E a -> Doc ann
pretty E a
e0 Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"\\~" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E a -> Doc ann
pretty E a
e1)
    ps Int
d (EApp a
_ E a
e0 E a
e1)                                           = Bool -> Doc ann -> Doc ann
forall {ann}. Bool -> Doc ann -> Doc ann
parensp (Int
dInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>Int
10) (Int -> E a -> Doc ann
forall ann. Int -> E a -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps Int
10 E a
e0 Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Int -> E a -> Doc ann
forall ann. Int -> E a -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps Int
11 E a
e1)
    ps Int
_ (FLit a
_ Double
x)                                               = Double -> Doc ann
forall ann. Double -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Double
x
    ps Int
_ (ILit a
_ Integer
n)                                               = Integer -> Doc ann
forall ann. Integer -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty Integer
n
    ps Int
_ (BLit a
_ Bool
True)                                            = Doc ann
"#t"
    ps Int
_ (BLit a
_ Bool
False)                                           = Doc ann
"#f"
    ps Int
_ (Dfn a
_ E a
e)                                                = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets (E a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E a -> Doc ann
pretty E a
e)
    ps Int
_ (ResVar a
_ ResVar
x)                                             = ResVar -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. ResVar -> Doc ann
pretty ResVar
x
    ps Int
_ (Parens a
_ E a
e)                                             = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (E a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E a -> Doc ann
pretty E a
e)
    ps Int
_ (Let a
_ (Nm a
n, E a
e) E a
e')                                        = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces (Nm a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Nm a -> Doc ann
pretty Nm a
n Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"←" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E a -> Doc ann
pretty E a
e Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
";" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E a -> Doc ann
pretty E a
e')
    ps Int
_ (Def a
_ (Nm a
n, E a
e) E a
e')                                        = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces (Nm a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Nm a -> Doc ann
pretty Nm a
n Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"⇐" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E a -> Doc ann
pretty E a
e Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
";" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E a -> Doc ann
pretty E a
e')
    ps Int
_ (LLet a
_ (Nm a
n, E a
e) E a
e')                                       = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
braces (Nm a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Nm a -> Doc ann
pretty Nm a
n Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"⟜" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E a -> Doc ann
pretty E a
e Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
";" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E a -> Doc ann
pretty E a
e')
    ps Int
_ (Id a
_ Idiom
idm)                                               = Idiom -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. Idiom -> Doc ann
pretty Idiom
idm
    ps Int
_ (Tup a
_ [E a]
es)                                               = [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
tupled (E a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E a -> Doc ann
pretty (E a -> Doc ann) -> [E a] -> [Doc ann]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [E a]
es)
    ps Int
_ (ALit a
_ [E a]
es)                                              = [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
tupledArr (E a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E a -> Doc ann
pretty (E a -> Doc ann) -> [E a] -> [Doc ann]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [E a]
es)
    ps Int
d (Ann a
_ E a
e T a
t)                                              = Bool -> Doc ann -> Doc ann
forall {ann}. Bool -> Doc ann -> Doc ann
parensp (Int
dInt -> Int -> Bool
forall a. Ord a => a -> a -> Bool
>Int
1) (Int -> E a -> Doc ann
forall ann. Int -> E a -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps Int
2 E a
e Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"::" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Int -> T a -> Doc ann
forall ann. Int -> T a -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps Int
1 T a
t)
    ps Int
d (Cond a
_ E a
p E a
e₀ E a
e₁)                                         = Doc ann
"?" Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> E a -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E a -> Doc ann
pretty E a
p Doc ann -> Doc ann -> Doc ann
forall a. Semigroup a => a -> a -> a
<> Doc ann
",." Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Int -> E a -> Doc ann
forall ann. Int -> E a -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps Int
d E a
e₀ Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
",." Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Int -> E a -> Doc ann
forall ann. Int -> E a -> Doc ann
forall a ann. PS a => Int -> a -> Doc ann
ps Int
d E a
e₁

instance Show (E a) where show :: E a -> String
show=Doc Any -> String
forall a. Show a => a -> String
show(Doc Any -> String) -> (E a -> Doc Any) -> E a -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.E a -> Doc Any
forall a ann. Pretty a => a -> Doc ann
forall ann. E a -> Doc ann
pretty

data ResVar = X | Y deriving ((forall x. ResVar -> Rep ResVar x)
-> (forall x. Rep ResVar x -> ResVar) -> Generic ResVar
forall x. Rep ResVar x -> ResVar
forall x. ResVar -> Rep ResVar x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. ResVar -> Rep ResVar x
from :: forall x. ResVar -> Rep ResVar x
$cto :: forall x. Rep ResVar x -> ResVar
to :: forall x. Rep ResVar x -> ResVar
Generic)

instance Pretty ResVar where
    pretty :: forall ann. ResVar -> Doc ann
pretty ResVar
X = Doc ann
"x"; pretty ResVar
Y = Doc ann
"y"

data Idiom = FoldSOfZip { Idiom -> E (T ())
seedI, Idiom -> E (T ())
opI :: E (T ()), Idiom -> [E (T ())]
esI :: [E (T ())] }
           | FoldOfZip { Idiom -> E (T ())
zopI, opI :: E (T ()), esI :: [E (T ())] }
           | FoldGen { Idiom -> E (T ())
seedG, Idiom -> E (T ())
ufG, Idiom -> E (T ())
fG, Idiom -> E (T ())
nG :: E (T ()) }
           | AShLit { Idiom -> [Int]
litSh :: [Int], Idiom -> [E (T ())]
esLit :: [E (T ())] }
           deriving ((forall x. Idiom -> Rep Idiom x)
-> (forall x. Rep Idiom x -> Idiom) -> Generic Idiom
forall x. Rep Idiom x -> Idiom
forall x. Idiom -> Rep Idiom x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Idiom -> Rep Idiom x
from :: forall x. Idiom -> Rep Idiom x
$cto :: forall x. Rep Idiom x -> Idiom
to :: forall x. Rep Idiom x -> Idiom
Generic)

instance Pretty Idiom where
    pretty :: forall ann. Idiom -> Doc ann
pretty (FoldSOfZip E (T ())
seed E (T ())
op [E (T ())]
es) = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Doc ann
"foldS-of-zip" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E (T ()) -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E (T ()) -> Doc ann
pretty E (T ())
seed Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E (T ()) -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E (T ()) -> Doc ann
pretty E (T ())
op Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> [E (T ())] -> Doc ann
forall ann. [E (T ())] -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty [E (T ())]
es)
    pretty (FoldOfZip E (T ())
zop E (T ())
op [E (T ())]
es)   = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Doc ann
"fold-of-zip" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E (T ()) -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E (T ()) -> Doc ann
pretty E (T ())
zop Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> E (T ()) -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E (T ()) -> Doc ann
pretty E (T ())
op Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> [E (T ())] -> Doc ann
forall ann. [E (T ())] -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty [E (T ())]
es)
    pretty (FoldGen E (T ())
seed E (T ())
g E (T ())
f E (T ())
n)    = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Doc ann
"fold-gen" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
brackets (E (T ()) -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E (T ()) -> Doc ann
pretty E (T ())
seed) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (E (T ()) -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E (T ()) -> Doc ann
pretty E (T ())
g) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (E (T ()) -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E (T ()) -> Doc ann
pretty E (T ())
f) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (E (T ()) -> Doc ann
forall a ann. Pretty a => a -> Doc ann
forall ann. E (T ()) -> Doc ann
pretty E (T ())
n))
    pretty (AShLit [Int]
re [E (T ())]
es)          = Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann
parens (Doc ann
"re" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> [Doc ann] -> Doc ann
forall ann. [Doc ann] -> Doc ann
hsep (Int -> Doc ann
forall ann. Int -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty (Int -> Doc ann) -> [Int] -> [Doc ann]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> [Int]
re) Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> Doc ann
"|" Doc ann -> Doc ann -> Doc ann
forall ann. Doc ann -> Doc ann -> Doc ann
<+> [E (T ())] -> Doc ann
forall ann. [E (T ())] -> Doc ann
forall a ann. Pretty a => a -> Doc ann
pretty [E (T ())]
es)

instance Show Idiom where show :: Idiom -> String
show=Doc Any -> String
forall a. Show a => a -> String
show(Doc Any -> String) -> (Idiom -> Doc Any) -> Idiom -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
.Idiom -> Doc Any
forall a ann. Pretty a => a -> Doc ann
forall ann. Idiom -> Doc ann
pretty

data E a = ALit { forall a. E a -> a
eAnn :: a, forall a. E a -> [E a]
arrLit :: [E a] } -- TODO: include shape?
         -- TODO: bool array
         | Var { eAnn :: a, forall a. E a -> Nm a
eVar :: Nm a }
         | Builtin { eAnn :: a, forall a. E a -> Builtin
eBuiltin :: !Builtin }
         | EApp { eAnn :: a, forall a. E a -> E a
eF, forall a. E a -> E a
eArg :: E a }
         | Lam { eAnn :: a, eVar :: Nm a, forall a. E a -> E a
eIn :: E a }
         | ILit { eAnn :: a, forall a. E a -> Integer
eILit :: !Integer }
         | FLit { eAnn :: a, forall a. E a -> Double
eFLit :: !Double }
         | BLit { eAnn :: a, forall a. E a -> Bool
eBLit :: !Bool }
         | Cond { eAnn :: a, forall a. E a -> E a
prop, forall a. E a -> E a
ifBranch, forall a. E a -> E a
elseBranch :: E a }
         | Let { eAnn :: a, forall a. E a -> (Nm a, E a)
eBnd :: (Nm a, E a), eIn :: E a }
         | Def { eAnn :: a, eBnd :: (Nm a, E a), eIn :: E a }
         | LLet { eAnn :: a, eBnd :: (Nm a, E a), eIn :: E a }
         | Dfn { eAnn :: a, eIn :: E a }
         | ResVar { eAnn :: a, forall a. E a -> ResVar
eXY :: ResVar }
         | Parens { eAnn :: a, forall a. E a -> E a
eExp :: E a }
         | Ann { eAnn :: a, forall a. E a -> E a
eEe :: E a, forall a. E a -> T a
eTy :: T a }
         | Tup { eAnn :: a, forall a. E a -> [E a]
eEs :: [E a] }
         | Id { eAnn :: a, forall a. E a -> Idiom
eIdiom :: Idiom }
         deriving ((forall a b. (a -> b) -> E a -> E b)
-> (forall a b. a -> E b -> E a) -> Functor E
forall a b. a -> E b -> E a
forall a b. (a -> b) -> E a -> E b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall a b. (a -> b) -> E a -> E b
fmap :: forall a b. (a -> b) -> E a -> E b
$c<$ :: forall a b. a -> E b -> E a
<$ :: forall a b. a -> E b -> E a
Functor, (forall x. E a -> Rep (E a) x)
-> (forall x. Rep (E a) x -> E a) -> Generic (E a)
forall x. Rep (E a) x -> E a
forall x. E a -> Rep (E a) x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
forall a x. Rep (E a) x -> E a
forall a x. E a -> Rep (E a) x
$cfrom :: forall a x. E a -> Rep (E a) x
from :: forall x. E a -> Rep (E a) x
$cto :: forall a x. Rep (E a) x -> E a
to :: forall x. Rep (E a) x -> E a
Generic)

instance NFData Builtin where
instance NFData ResVar where
instance NFData Idiom where
instance NFData a => NFData (E a) where
instance NFData a => NFData (I a) where
instance NFData a => NFData (Sh a) where
instance NFData a => NFData (T a) where