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