{-# LANGUAGE FlexibleInstances, OverloadedStrings, TypeSynonymInstances #-}
module IRTS.Portable (writePortable) where
import Idris.Core.CaseTree
import Idris.Core.Evaluate
import Idris.Core.TT
import IRTS.Bytecode
import IRTS.CodegenCommon
import IRTS.Defunctionalise
import IRTS.Simplified
import Data.Aeson
import qualified Data.ByteString.Lazy as B
import System.IO
data CodegenFile = CGFile {
CodegenFile -> String
fileType :: String,
CodegenFile -> Int
version :: Int,
CodegenFile -> CodegenInfo
cgInfo :: CodegenInfo
}
formatVersion :: Int
formatVersion :: Int
formatVersion = Int
3
writePortable :: Handle -> CodegenInfo -> IO ()
writePortable :: Handle -> CodegenInfo -> IO ()
writePortable Handle
file CodegenInfo
ci = do
let json :: ByteString
json = forall a. ToJSON a => a -> ByteString
encode forall a b. (a -> b) -> a -> b
$ String -> Int -> CodegenInfo -> CodegenFile
CGFile String
"idris-codegen" Int
formatVersion CodegenInfo
ci
Handle -> ByteString -> IO ()
B.hPut Handle
file ByteString
json
instance ToJSON CodegenFile where
toJSON :: CodegenFile -> Value
toJSON (CGFile String
ft Int
v CodegenInfo
ci) = [Pair] -> Value
object [Key
"file-type" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= String
ft,
Key
"version" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Int
v,
Key
"codegen-info" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= forall a. ToJSON a => a -> Value
toJSON CodegenInfo
ci]
instance ToJSON CodegenInfo where
toJSON :: CodegenInfo -> Value
toJSON CodegenInfo
ci = [Pair] -> Value
object [Key
"output-file" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (CodegenInfo -> String
outputFile CodegenInfo
ci),
Key
"includes" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (CodegenInfo -> [String]
includes CodegenInfo
ci),
Key
"import-dirs" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (CodegenInfo -> [String]
importDirs CodegenInfo
ci),
Key
"compile-objs" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (CodegenInfo -> [String]
compileObjs CodegenInfo
ci),
Key
"compile-libs" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (CodegenInfo -> [String]
compileLibs CodegenInfo
ci),
Key
"compiler-flags" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (CodegenInfo -> [String]
compilerFlags CodegenInfo
ci),
Key
"interfaces" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (CodegenInfo -> Bool
interfaces CodegenInfo
ci),
Key
"exports" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (CodegenInfo -> [ExportIFace]
exportDecls CodegenInfo
ci),
Key
"lift-decls" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (CodegenInfo -> [(Name, LDecl)]
liftDecls CodegenInfo
ci),
Key
"defun-decls" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (CodegenInfo -> [(Name, DDecl)]
defunDecls CodegenInfo
ci),
Key
"simple-decls" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (CodegenInfo -> [(Name, SDecl)]
simpleDecls CodegenInfo
ci),
Key
"bytecode" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (forall a b. (a -> b) -> [a] -> [b]
map (Name, SDecl) -> (Name, [BC])
toBC (CodegenInfo -> [(Name, SDecl)]
simpleDecls CodegenInfo
ci)),
Key
"tt-decls" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (CodegenInfo -> [(Name, TTDecl)]
ttDecls CodegenInfo
ci)]
instance ToJSON Name where
toJSON :: Name -> Value
toJSON Name
n = forall a. ToJSON a => a -> Value
toJSON forall a b. (a -> b) -> a -> b
$ Name -> String
showCG Name
n
instance ToJSON ExportIFace where
toJSON :: ExportIFace -> Value
toJSON (Export Name
n String
f [Export]
xs) = [Pair] -> Value
object [Key
"ffi-desc" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Name
n,
Key
"interface-file" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= String
f,
Key
"exports" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= [Export]
xs]
instance ToJSON FDesc where
toJSON :: FDesc -> Value
toJSON (FCon Name
n) = [Pair] -> Value
object [Key
"FCon" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Name
n]
toJSON (FStr String
s) = [Pair] -> Value
object [Key
"FStr" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= String
s]
toJSON (FDesc
FUnknown) = [Pair] -> Value
object [Key
"FUnknown" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON (FIO FDesc
fd) = [Pair] -> Value
object [Key
"FIO" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= FDesc
fd]
toJSON (FApp Name
n [FDesc]
xs) = [Pair] -> Value
object [Key
"FApp" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Name
n, [FDesc]
xs)]
instance ToJSON Export where
toJSON :: Export -> Value
toJSON (ExportData FDesc
fd) = [Pair] -> Value
object [Key
"ExportData" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= FDesc
fd]
toJSON (ExportFun Name
n FDesc
dsc FDesc
ret [FDesc]
args) = [Pair] -> Value
object [Key
"ExportFun" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Name
n, FDesc
dsc, FDesc
ret, [FDesc]
args)]
instance ToJSON LDecl where
toJSON :: LDecl -> Value
toJSON (LFun [LOpt]
opts Name
name [Name]
args LExp
def) = [Pair] -> Value
object [Key
"LFun" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= ([LOpt]
opts, Name
name, [Name]
args, LExp
def)]
toJSON (LConstructor Name
name Int
tag Int
ar) = [Pair] -> Value
object [Key
"LConstructor" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Name
name, Int
tag, Int
ar)]
instance ToJSON LOpt where
toJSON :: LOpt -> Value
toJSON LOpt
Inline = Text -> Value
String Text
"Inline"
toJSON LOpt
NoInline = Text -> Value
String Text
"NoInline"
instance ToJSON LExp where
toJSON :: LExp -> Value
toJSON (LV Name
lv) = [Pair] -> Value
object [Key
"LV" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Name
lv]
toJSON (LApp Bool
tail LExp
exp [LExp]
args) = [Pair] -> Value
object [Key
"LApp" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Bool
tail, LExp
exp, [LExp]
args)]
toJSON (LLazyApp Name
name [LExp]
exps) = [Pair] -> Value
object [Key
"LLazyApp" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Name
name, [LExp]
exps)]
toJSON (LLazyExp LExp
exp) = [Pair] -> Value
object [Key
"LLazyExp" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= LExp
exp]
toJSON (LForce LExp
exp) = [Pair] -> Value
object [Key
"LForce" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= LExp
exp]
toJSON (LLet Name
name LExp
a LExp
b) = [Pair] -> Value
object [Key
"LLet" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Name
name, LExp
a, LExp
b)]
toJSON (LLam [Name]
args LExp
exp) = [Pair] -> Value
object [Key
"LLam" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= ([Name]
args, LExp
exp)]
toJSON (LProj LExp
exp Int
i) = [Pair] -> Value
object [Key
"LProj" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (LExp
exp, Int
i)]
toJSON (LCon Maybe Name
lv Int
i Name
n [LExp]
exps) = [Pair] -> Value
object [Key
"LCon" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Maybe Name
lv, Int
i, Name
n, [LExp]
exps)]
toJSON (LCase CaseType
ct LExp
exp [LAlt]
alts) = [Pair] -> Value
object [Key
"LCase" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (CaseType
ct, LExp
exp, [LAlt]
alts)]
toJSON (LConst Const
c) = [Pair] -> Value
object [Key
"LConst" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Const
c]
toJSON (LForeign FDesc
fd FDesc
ret [(FDesc, LExp)]
exps) = [Pair] -> Value
object [Key
"LForeign" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (FDesc
fd, FDesc
ret, [(FDesc, LExp)]
exps)]
toJSON (LOp PrimFn
prim [LExp]
exps) = [Pair] -> Value
object [Key
"LOp" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (PrimFn
prim, [LExp]
exps)]
toJSON LExp
LNothing = [Pair] -> Value
object [Key
"LNothing" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON (LError String
s) = [Pair] -> Value
object [Key
"LError" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= String
s]
instance ToJSON LVar where
toJSON :: LVar -> Value
toJSON (Loc Int
i) = [Pair] -> Value
object [Key
"Loc" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Int
i]
toJSON (Glob Name
n) = [Pair] -> Value
object [Key
"Glob" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Name
n]
instance ToJSON CaseType where
toJSON :: CaseType -> Value
toJSON CaseType
Updatable = Text -> Value
String Text
"Updatable"
toJSON CaseType
Shared = Text -> Value
String Text
"Shared"
instance ToJSON LAlt where
toJSON :: LAlt -> Value
toJSON (LConCase Int
i Name
n [Name]
ns LExp
exp) = [Pair] -> Value
object [Key
"LConCase" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Int
i, Name
n, [Name]
ns, LExp
exp)]
toJSON (LConstCase Const
c LExp
exp) = [Pair] -> Value
object [Key
"LConstCase" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Const
c, LExp
exp)]
toJSON (LDefaultCase LExp
exp) = [Pair] -> Value
object [Key
"LDefaultCase" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= LExp
exp]
instance ToJSON Const where
toJSON :: Const -> Value
toJSON (I Int
i) = [Pair] -> Value
object [Key
"int" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Int
i]
toJSON (BI Integer
i) = [Pair] -> Value
object [Key
"bigint" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (forall a. Show a => a -> String
show Integer
i)]
toJSON (Fl Double
d) = [Pair] -> Value
object [Key
"double" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Double
d]
toJSON (Ch Char
c) = [Pair] -> Value
object [Key
"char" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (forall a. Show a => a -> String
show Char
c)]
toJSON (Str String
s) = [Pair] -> Value
object [Key
"string" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= String
s]
toJSON (B8 Word8
b) = [Pair] -> Value
object [Key
"bits8" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Word8
b]
toJSON (B16 Word16
b) = [Pair] -> Value
object [Key
"bits16" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Word16
b]
toJSON (B32 Word32
b) = [Pair] -> Value
object [Key
"bits32" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Word32
b]
toJSON (B64 Word64
b) = [Pair] -> Value
object [Key
"bits64" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Word64
b]
toJSON (AType ArithTy
at) = [Pair] -> Value
object [Key
"atype" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= ArithTy
at]
toJSON Const
StrType = [Pair] -> Value
object [Key
"strtype" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON Const
WorldType = [Pair] -> Value
object [Key
"worldtype" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON Const
TheWorld = [Pair] -> Value
object [Key
"theworld" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON Const
VoidType = [Pair] -> Value
object [Key
"voidtype" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON Const
Forgot = [Pair] -> Value
object [Key
"forgot" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
instance ToJSON ArithTy where
toJSON :: ArithTy -> Value
toJSON (ATInt IntTy
it) = [Pair] -> Value
object [Key
"ATInt" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= IntTy
it]
toJSON ArithTy
ATFloat = [Pair] -> Value
object [Key
"ATFloat" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
instance ToJSON IntTy where
toJSON :: IntTy -> Value
toJSON IntTy
it = forall a. ToJSON a => a -> Value
toJSON forall a b. (a -> b) -> a -> b
$ IntTy -> String
intTyName IntTy
it
instance ToJSON PrimFn where
toJSON :: PrimFn -> Value
toJSON (LPlus ArithTy
aty) = [Pair] -> Value
object [Key
"LPlus" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= ArithTy
aty]
toJSON (LMinus ArithTy
aty) = [Pair] -> Value
object [Key
"LMinus" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= ArithTy
aty]
toJSON (LTimes ArithTy
aty) = [Pair] -> Value
object [Key
"LTimes" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= ArithTy
aty]
toJSON (LUDiv IntTy
aty) = [Pair] -> Value
object [Key
"LUDiv" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= IntTy
aty]
toJSON (LSDiv ArithTy
aty) = [Pair] -> Value
object [Key
"LSDiv" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= ArithTy
aty]
toJSON (LURem IntTy
ity) = [Pair] -> Value
object [Key
"LURem" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= IntTy
ity]
toJSON (LSRem ArithTy
aty) = [Pair] -> Value
object [Key
"LSRem" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= ArithTy
aty]
toJSON (LAnd IntTy
ity) = [Pair] -> Value
object [Key
"LAnd" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= IntTy
ity]
toJSON (LOr IntTy
ity) = [Pair] -> Value
object [Key
"LOr" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= IntTy
ity]
toJSON (LXOr IntTy
ity) = [Pair] -> Value
object [Key
"LXOr" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= IntTy
ity]
toJSON (LCompl IntTy
ity) = [Pair] -> Value
object [Key
"LCompl" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= IntTy
ity]
toJSON (LSHL IntTy
ity) = [Pair] -> Value
object [Key
"LSHL" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= IntTy
ity]
toJSON (LLSHR IntTy
ity) = [Pair] -> Value
object [Key
"LLSHR" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= IntTy
ity]
toJSON (LASHR IntTy
ity) = [Pair] -> Value
object [Key
"LASHR" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= IntTy
ity]
toJSON (LEq ArithTy
aty) = [Pair] -> Value
object [Key
"LEq" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= ArithTy
aty]
toJSON (LLt IntTy
ity) = [Pair] -> Value
object [Key
"LLt" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= IntTy
ity]
toJSON (LLe IntTy
ity) = [Pair] -> Value
object [Key
"LLe" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= IntTy
ity]
toJSON (LGt IntTy
ity) = [Pair] -> Value
object [Key
"LGt" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= IntTy
ity]
toJSON (LGe IntTy
ity) = [Pair] -> Value
object [Key
"LGe" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= IntTy
ity]
toJSON (LSLt ArithTy
aty) = [Pair] -> Value
object [Key
"LSLt" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= ArithTy
aty]
toJSON (LSLe ArithTy
aty) = [Pair] -> Value
object [Key
"LSLe" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= ArithTy
aty]
toJSON (LSGt ArithTy
aty) = [Pair] -> Value
object [Key
"LSGt" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= ArithTy
aty]
toJSON (LSGe ArithTy
aty) = [Pair] -> Value
object [Key
"LSGe" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= ArithTy
aty]
toJSON (LZExt IntTy
from IntTy
to) = [Pair] -> Value
object [Key
"LZExt" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (IntTy
from, IntTy
to)]
toJSON (LSExt IntTy
from IntTy
to) = [Pair] -> Value
object [Key
"LSExt" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (IntTy
from, IntTy
to)]
toJSON (LTrunc IntTy
from IntTy
to) = [Pair] -> Value
object [Key
"LTrunc" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (IntTy
from, IntTy
to)]
toJSON PrimFn
LStrConcat = [Pair] -> Value
object [Key
"LStrConcat" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON PrimFn
LStrLt = [Pair] -> Value
object [Key
"LStrLt" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON PrimFn
LStrEq = [Pair] -> Value
object [Key
"LStrEq" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON PrimFn
LStrLen = [Pair] -> Value
object [Key
"LStrLen" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON (LIntFloat IntTy
ity) = [Pair] -> Value
object [Key
"LIntFloat" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= IntTy
ity]
toJSON (LFloatInt IntTy
ity) = [Pair] -> Value
object [Key
"LFloatInt" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= IntTy
ity]
toJSON (LIntStr IntTy
ity) = [Pair] -> Value
object [Key
"LIntStr" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= IntTy
ity]
toJSON (LStrInt IntTy
ity) = [Pair] -> Value
object [Key
"LStrInt" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= IntTy
ity]
toJSON (LIntCh IntTy
ity) = [Pair] -> Value
object [Key
"LIntCh" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= IntTy
ity]
toJSON (LChInt IntTy
ity) = [Pair] -> Value
object [Key
"LChInt" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= IntTy
ity]
toJSON PrimFn
LFloatStr = [Pair] -> Value
object [Key
"LFloatStr" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON PrimFn
LStrFloat = [Pair] -> Value
object [Key
"LStrFloat" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON (LBitCast ArithTy
from ArithTy
to) = [Pair] -> Value
object [Key
"LBitCast" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (ArithTy
from, ArithTy
to)]
toJSON PrimFn
LFExp = [Pair] -> Value
object [Key
"LFExp" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON PrimFn
LFLog = [Pair] -> Value
object [Key
"LFLog" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON PrimFn
LFSin = [Pair] -> Value
object [Key
"LFSin" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON PrimFn
LFCos = [Pair] -> Value
object [Key
"LFCos" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON PrimFn
LFTan = [Pair] -> Value
object [Key
"LFTan" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON PrimFn
LFASin = [Pair] -> Value
object [Key
"LFASin" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON PrimFn
LFACos = [Pair] -> Value
object [Key
"LFACos" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON PrimFn
LFATan = [Pair] -> Value
object [Key
"LFATan" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON PrimFn
LFATan2 = [Pair] -> Value
object [Key
"LFATan2" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON PrimFn
LFSqrt = [Pair] -> Value
object [Key
"LFSqrt" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON PrimFn
LFFloor = [Pair] -> Value
object [Key
"LFFloor" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON PrimFn
LFCeil = [Pair] -> Value
object [Key
"LFCeil" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON PrimFn
LFNegate = [Pair] -> Value
object [Key
"LFNegate" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON PrimFn
LStrHead = [Pair] -> Value
object [Key
"LStrHead" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON PrimFn
LStrTail = [Pair] -> Value
object [Key
"LStrTail" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON PrimFn
LStrCons = [Pair] -> Value
object [Key
"LStrCons" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON PrimFn
LStrIndex = [Pair] -> Value
object [Key
"LStrIndex" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON PrimFn
LStrRev = [Pair] -> Value
object [Key
"LStrRev" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON PrimFn
LStrSubstr = [Pair] -> Value
object [Key
"LStrSubstr" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON PrimFn
LReadStr = [Pair] -> Value
object [Key
"LReadStr" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON PrimFn
LWriteStr = [Pair] -> Value
object [Key
"LWriteStr" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON PrimFn
LSystemInfo = [Pair] -> Value
object [Key
"LSystemInfo" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON PrimFn
LFork = [Pair] -> Value
object [Key
"LFork" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON PrimFn
LPar = [Pair] -> Value
object [Key
"LPar" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON (LExternal Name
name) = [Pair] -> Value
object [Key
"LExternal" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Name
name]
toJSON PrimFn
LCrash = [Pair] -> Value
object [Key
"LCrash" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON PrimFn
LNoOp = [Pair] -> Value
object [Key
"LNoOp" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
instance ToJSON DDecl where
toJSON :: DDecl -> Value
toJSON (DFun Name
name [Name]
args DExp
exp) = [Pair] -> Value
object [Key
"DFun" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Name
name, [Name]
args, DExp
exp)]
toJSON (DConstructor Name
name Int
tag Int
arity) = [Pair] -> Value
object [Key
"DConstructor" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Name
name, Int
tag, Int
arity)]
instance ToJSON DExp where
toJSON :: DExp -> Value
toJSON (DV Name
lv) = [Pair] -> Value
object [Key
"DV" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Name
lv]
toJSON (DApp Bool
tail Name
name [DExp]
exps) = [Pair] -> Value
object [Key
"DApp" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Bool
tail, Name
name, [DExp]
exps)]
toJSON (DLet Name
name DExp
a DExp
b) = [Pair] -> Value
object [Key
"DLet" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Name
name, DExp
a, DExp
b)]
toJSON (DUpdate Name
name DExp
exp) = [Pair] -> Value
object [Key
"DUpdate" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Name
name,DExp
exp)]
toJSON (DProj DExp
exp Int
i) = [Pair] -> Value
object [Key
"DProj" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (DExp
exp, Int
i)]
toJSON (DC Maybe Name
lv Int
i Name
name [DExp]
exp) = [Pair] -> Value
object [Key
"DC" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Maybe Name
lv, Int
i, Name
name, [DExp]
exp)]
toJSON (DCase CaseType
ct DExp
exp [DAlt]
alts) = [Pair] -> Value
object [Key
"DCase" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (CaseType
ct, DExp
exp, [DAlt]
alts)]
toJSON (DChkCase DExp
exp [DAlt]
alts) = [Pair] -> Value
object [Key
"DChkCase" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (DExp
exp, [DAlt]
alts)]
toJSON (DConst Const
c) = [Pair] -> Value
object [Key
"DConst" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Const
c]
toJSON (DForeign FDesc
fd FDesc
ret [(FDesc, DExp)]
exps) = [Pair] -> Value
object [Key
"DForeign" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (FDesc
fd, FDesc
ret, [(FDesc, DExp)]
exps)]
toJSON (DOp PrimFn
prim [DExp]
exps) = [Pair] -> Value
object [Key
"DOp" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (PrimFn
prim, [DExp]
exps)]
toJSON DExp
DNothing = [Pair] -> Value
object [Key
"DNothing" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON (DError String
s) = [Pair] -> Value
object [Key
"DError" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= String
s]
instance ToJSON DAlt where
toJSON :: DAlt -> Value
toJSON (DConCase Int
i Name
n [Name]
ns DExp
exp) = [Pair] -> Value
object [Key
"DConCase" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Int
i, Name
n, [Name]
ns, DExp
exp)]
toJSON (DConstCase Const
c DExp
exp) = [Pair] -> Value
object [Key
"DConstCase" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Const
c, DExp
exp)]
toJSON (DDefaultCase DExp
exp) = [Pair] -> Value
object [Key
"DDefaultCase" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= DExp
exp]
instance ToJSON SDecl where
toJSON :: SDecl -> Value
toJSON (SFun Name
name [Name]
args Int
i SExp
exp) = [Pair] -> Value
object [Key
"SFun" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Name
name, [Name]
args, Int
i, SExp
exp)]
instance ToJSON SExp where
toJSON :: SExp -> Value
toJSON (SV LVar
lv) = [Pair] -> Value
object [Key
"SV" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= LVar
lv]
toJSON (SApp Bool
tail Name
name [LVar]
exps) = [Pair] -> Value
object [Key
"SApp" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Bool
tail, Name
name, [LVar]
exps)]
toJSON (SLet LVar
lv SExp
a SExp
b) = [Pair] -> Value
object [Key
"SLet" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (LVar
lv, SExp
a, SExp
b)]
toJSON (SUpdate LVar
lv SExp
exp) = [Pair] -> Value
object [Key
"SUpdate" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (LVar
lv, SExp
exp)]
toJSON (SProj LVar
lv Int
i) = [Pair] -> Value
object [Key
"SProj" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (LVar
lv, Int
i)]
toJSON (SCon Maybe LVar
lv Int
i Name
name [LVar]
vars) = [Pair] -> Value
object [Key
"SCon" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Maybe LVar
lv, Int
i, Name
name, [LVar]
vars)]
toJSON (SCase CaseType
ct LVar
lv [SAlt]
alts) = [Pair] -> Value
object [Key
"SCase" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (CaseType
ct, LVar
lv, [SAlt]
alts)]
toJSON (SChkCase LVar
lv [SAlt]
alts) = [Pair] -> Value
object [Key
"SChkCase" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (LVar
lv, [SAlt]
alts)]
toJSON (SConst Const
c) = [Pair] -> Value
object [Key
"SConst" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Const
c]
toJSON (SForeign FDesc
fd FDesc
ret [(FDesc, LVar)]
exps) = [Pair] -> Value
object [Key
"SForeign" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (FDesc
fd, FDesc
ret, [(FDesc, LVar)]
exps)]
toJSON (SOp PrimFn
prim [LVar]
vars) = [Pair] -> Value
object [Key
"SOp" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (PrimFn
prim, [LVar]
vars)]
toJSON SExp
SNothing = [Pair] -> Value
object [Key
"SNothing" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON (SError String
s) = [Pair] -> Value
object [Key
"SError" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= String
s]
instance ToJSON SAlt where
toJSON :: SAlt -> Value
toJSON (SConCase Int
i Int
j Name
n [Name]
ns SExp
exp) = [Pair] -> Value
object [Key
"SConCase" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Int
i, Int
j, Name
n, [Name]
ns, SExp
exp)]
toJSON (SConstCase Const
c SExp
exp) = [Pair] -> Value
object [Key
"SConstCase" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Const
c, SExp
exp)]
toJSON (SDefaultCase SExp
exp) = [Pair] -> Value
object [Key
"SDefaultCase" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= SExp
exp]
instance ToJSON BC where
toJSON :: BC -> Value
toJSON (ASSIGN Reg
r1 Reg
r2) = [Pair] -> Value
object [Key
"ASSIGN" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Reg
r1, Reg
r2)]
toJSON (ASSIGNCONST Reg
r Const
c) = [Pair] -> Value
object [Key
"ASSIGNCONST" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Reg
r, Const
c)]
toJSON (UPDATE Reg
r1 Reg
r2) = [Pair] -> Value
object [Key
"UPDATE" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Reg
r1, Reg
r2)]
toJSON (MKCON Reg
con Maybe Reg
mr Int
i [Reg]
regs) = [Pair] -> Value
object [Key
"MKCON" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Reg
con, Maybe Reg
mr, Int
i, [Reg]
regs)]
toJSON (CASE Bool
b Reg
r [(Int, [BC])]
alts Maybe [BC]
def) = [Pair] -> Value
object [Key
"CASE" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Bool
b, Reg
r, [(Int, [BC])]
alts, Maybe [BC]
def)]
toJSON (PROJECT Reg
r Int
loc Int
arity) = [Pair] -> Value
object [Key
"PROJECT" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Reg
r, Int
loc, Int
arity)]
toJSON (PROJECTINTO Reg
r1 Reg
r2 Int
loc) = [Pair] -> Value
object [Key
"PROJECTINTO" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Reg
r1, Reg
r2, Int
loc)]
toJSON (CONSTCASE Reg
r [(Const, [BC])]
alts Maybe [BC]
def) = [Pair] -> Value
object [Key
"CONSTCASE" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Reg
r, [(Const, [BC])]
alts, Maybe [BC]
def)]
toJSON (CALL Name
name) = [Pair] -> Value
object [Key
"CALL" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Name
name]
toJSON (TAILCALL Name
name) = [Pair] -> Value
object [Key
"TAILCALL" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Name
name]
toJSON (FOREIGNCALL Reg
r FDesc
fd FDesc
ret [(FDesc, Reg)]
exps) = [Pair] -> Value
object [Key
"FOREIGNCALL" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Reg
r, FDesc
fd, FDesc
ret, [(FDesc, Reg)]
exps)]
toJSON (SLIDE Int
i) = [Pair] -> Value
object [Key
"SLIDE" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Int
i]
toJSON (RESERVE Int
i) = [Pair] -> Value
object [Key
"RESERVE" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Int
i]
toJSON (RESERVENOALLOC Int
i) = [Pair] -> Value
object [Key
"RESERVENOALLOC" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Int
i]
toJSON (ADDTOP Int
i) = [Pair] -> Value
object [Key
"ADDTOP" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Int
i]
toJSON (TOPBASE Int
i) = [Pair] -> Value
object [Key
"TOPBASE" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Int
i]
toJSON (BASETOP Int
i) = [Pair] -> Value
object [Key
"BASETOP" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Int
i]
toJSON BC
REBASE = [Pair] -> Value
object [Key
"REBASE" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON BC
STOREOLD = [Pair] -> Value
object [Key
"STOREOLD" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON (OP Reg
r PrimFn
prim [Reg]
args) = [Pair] -> Value
object [Key
"OP" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Reg
r, PrimFn
prim, [Reg]
args)]
toJSON (NULL Reg
r) = [Pair] -> Value
object [Key
"NULL" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Reg
r]
toJSON (ERROR String
s) = [Pair] -> Value
object [Key
"ERROR" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= String
s]
instance ToJSON Reg where
toJSON :: Reg -> Value
toJSON Reg
RVal = [Pair] -> Value
object [Key
"RVal" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON (T Int
i) = [Pair] -> Value
object [Key
"T" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Int
i]
toJSON (L Int
i) = [Pair] -> Value
object [Key
"L" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Int
i]
toJSON Reg
Tmp = [Pair] -> Value
object [Key
"Tmp" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
instance ToJSON RigCount where
toJSON :: RigCount -> Value
toJSON RigCount
r = [Pair] -> Value
object [Key
"RigCount" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= forall a. Show a => a -> String
show RigCount
r]
instance ToJSON Totality where
toJSON :: Totality -> Value
toJSON Totality
t = [Pair] -> Value
object [Key
"Totality" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= forall a. Show a => a -> String
show Totality
t]
instance ToJSON MetaInformation where
toJSON :: MetaInformation -> Value
toJSON MetaInformation
m = [Pair] -> Value
object [Key
"MetaInformation" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= forall a. Show a => a -> String
show MetaInformation
m]
instance ToJSON Def where
toJSON :: Def -> Value
toJSON (Function Type
ty Type
tm) = [Pair] -> Value
object [Key
"Function" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Type
ty, Type
tm)]
toJSON (TyDecl NameType
nm Type
ty) = [Pair] -> Value
object [Key
"TyDecl" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (NameType
nm, Type
ty)]
toJSON (Operator Type
ty Int
n [Value] -> Maybe Value
f) = Value
Null
toJSON (CaseOp CaseInfo
info Type
ty [(Type, Bool)]
argTy [Either Type (Type, Type)]
_ [([Name], Type, Type)]
_ CaseDefs
cdefs) = [Pair] -> Value
object [Key
"CaseOp" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (CaseInfo
info, Type
ty, [(Type, Bool)]
argTy, CaseDefs
cdefs)]
instance (ToJSON t) => ToJSON (TT t) where
toJSON :: TT t -> Value
toJSON (P NameType
nt t
name TT t
term) = [Pair] -> Value
object [Key
"P" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (NameType
nt, t
name, TT t
term)]
toJSON (V Int
n) = [Pair] -> Value
object [Key
"V" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Int
n]
toJSON (Bind t
n Binder (TT t)
b TT t
tt) = [Pair] -> Value
object [Key
"Bind" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (t
n, Binder (TT t)
b, TT t
tt)]
toJSON (App AppStatus t
s TT t
t1 TT t
t2) = [Pair] -> Value
object [Key
"App" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (AppStatus t
s, TT t
t1, TT t
t2)]
toJSON (Constant Const
c) = [Pair] -> Value
object [Key
"Constant" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Const
c]
toJSON (Proj TT t
tt Int
n) = [Pair] -> Value
object [Key
"Proj" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (TT t
tt, Int
n)]
toJSON TT t
Erased = [Pair] -> Value
object [Key
"Erased" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON TT t
Impossible = [Pair] -> Value
object [Key
"Impossible" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON (Inferred TT t
tt) = [Pair] -> Value
object [Key
"Inferred" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= TT t
tt]
toJSON (TType UExp
u) = [Pair] -> Value
object [Key
"TType" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= UExp
u]
toJSON (UType Universe
u) = [Pair] -> Value
object [Key
"UType" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (forall a. Show a => a -> String
show Universe
u)]
instance ToJSON UExp where
toJSON :: UExp -> Value
toJSON (UVar String
src Int
n) = [Pair] -> Value
object [Key
"UVar" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (String
src, Int
n)]
toJSON (UVal Int
n) = [Pair] -> Value
object [Key
"UVal" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Int
n]
instance (ToJSON t) => ToJSON (AppStatus t) where
toJSON :: AppStatus t -> Value
toJSON AppStatus t
Complete = [Pair] -> Value
object [Key
"Complete" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON AppStatus t
MaybeHoles = [Pair] -> Value
object [Key
"MaybeHoles" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON (Holes [t]
ns) = [Pair] -> Value
object [Key
"Holes" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= [t]
ns]
instance (ToJSON t) => ToJSON (Binder t) where
toJSON :: Binder t -> Value
toJSON (Lam RigCount
rc t
bty) = [Pair] -> Value
object [Key
"Lam" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (RigCount
rc, t
bty)]
toJSON (Pi RigCount
c Maybe ImplicitInfo
i t
t t
k) = [Pair] -> Value
object [Key
"Pi" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (RigCount
c, Maybe ImplicitInfo
i, t
t, t
k)]
toJSON (Let RigCount
rc t
t t
v) = [Pair] -> Value
object [Key
"Let" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (t
t, t
v)]
toJSON (NLet t
t t
v) = [Pair] -> Value
object [Key
"NLet" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (t
t, t
v)]
toJSON (Hole t
t) = [Pair] -> Value
object [Key
"Hole" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (t
t)]
toJSON (GHole Int
l [Name]
ns t
t) = [Pair] -> Value
object [Key
"GHole" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Int
l, [Name]
ns, t
t)]
toJSON (Guess t
t t
v) = [Pair] -> Value
object [Key
"Guess" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (t
t, t
v)]
toJSON (PVar RigCount
rc t
t) = [Pair] -> Value
object [Key
"PVar" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (RigCount
rc, t
t)]
toJSON (PVTy t
t) = [Pair] -> Value
object [Key
"PVTy" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (t
t)]
instance ToJSON ImplicitInfo where
toJSON :: ImplicitInfo -> Value
toJSON (Impl Bool
a Bool
b Bool
c) = [Pair] -> Value
object [Key
"Impl" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Bool
a, Bool
b, Bool
c)]
instance ToJSON NameType where
toJSON :: NameType -> Value
toJSON NameType
Bound = [Pair] -> Value
object [Key
"Bound" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON NameType
Ref = [Pair] -> Value
object [Key
"Ref" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
toJSON (DCon Int
a Int
b Bool
c) = [Pair] -> Value
object [Key
"DCon" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Int
a, Int
b, Bool
c)]
toJSON (TCon Int
a Int
b) = [Pair] -> Value
object [Key
"TCon" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Int
a, Int
b)]
instance ToJSON CaseDefs where
toJSON :: CaseDefs -> Value
toJSON (CaseDefs ([Name], SC)
rt ([Name], SC)
ct) = [Pair] -> Value
object [Key
"Runtime" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= ([Name], SC)
rt, Key
"Compiletime" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= ([Name], SC)
ct]
instance (ToJSON t) => ToJSON (SC' t) where
toJSON :: SC' t -> Value
toJSON (Case CaseType
ct Name
n [CaseAlt' t]
alts) = [Pair] -> Value
object [Key
"Case" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (CaseType
ct, Name
n, [CaseAlt' t]
alts)]
toJSON (ProjCase t
t [CaseAlt' t]
alts) = [Pair] -> Value
object [Key
"ProjCase" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (t
t, [CaseAlt' t]
alts)]
toJSON (STerm t
t) = [Pair] -> Value
object [Key
"STerm" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= t
t]
toJSON (UnmatchedCase String
s) = [Pair] -> Value
object [Key
"UnmatchedCase" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= String
s]
toJSON SC' t
ImpossibleCase = [Pair] -> Value
object [Key
"ImpossibleCase" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= Value
Null]
instance (ToJSON t) => ToJSON (CaseAlt' t) where
toJSON :: CaseAlt' t -> Value
toJSON (ConCase Name
n Int
c [Name]
ns SC' t
sc) = [Pair] -> Value
object [Key
"ConCase" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Name
n, Int
c, [Name]
ns, SC' t
sc)]
toJSON (FnCase Name
n [Name]
ns SC' t
sc) = [Pair] -> Value
object [Key
"FnCase" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Name
n, [Name]
ns, SC' t
sc)]
toJSON (ConstCase Const
c SC' t
sc) = [Pair] -> Value
object [Key
"ConstCase" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Const
c, SC' t
sc)]
toJSON (SucCase Name
n SC' t
sc) = [Pair] -> Value
object [Key
"SucCase" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Name
n, SC' t
sc)]
toJSON (DefaultCase SC' t
sc) = [Pair] -> Value
object [Key
"DefaultCase" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= SC' t
sc]
instance ToJSON CaseInfo where
toJSON :: CaseInfo -> Value
toJSON (CaseInfo Bool
a Bool
b Bool
c) = [Pair] -> Value
object [Key
"CaseInfo" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= (Bool
a, Bool
b, Bool
c)]
instance ToJSON Accessibility where
toJSON :: Accessibility -> Value
toJSON Accessibility
a = [Pair] -> Value
object [Key
"Accessibility" forall kv v. (KeyValue kv, ToJSON v) => Key -> v -> kv
.= forall a. Show a => a -> String
show Accessibility
a]