0 | module Node.Internal.Elab
2 | import public Language.Reflection
3 | import Node.Internal.Support
5 | %language ElabReflection
9 | field : String -> Name
13 | basic : String -> Name
16 | isVar : String -> TTImp -> Bool
17 | isVar expected (IVar _ name) = hasName name
19 | hasName : Name -> Bool
20 | hasName (UN $
Basic n) = n == expected
21 | hasName (UN $
Field n) = n == expected
22 | hasName (NS ns name) = hasName name
26 | isMaybe : TTImp -> (Bool, TTImp)
27 | isMaybe (IApp _ name expr) = (isVar "Maybe" name, expr)
28 | isMaybe x = (False, x)
30 | fieldConvert : TTImp -> String -> String
31 | fieldConvert tti var with (isMaybe tti)
32 | _ | (True, inner) with (isVar "Bool" inner)
36 | if (v === undefined || v === null) {
39 | return _just(v ? _true() : _false())
45 | if (v === undefined || v === null) {
51 | _ | (False, inner) with (isVar "Bool" inner)
52 | _ | True = "\{var} ? _true() : _false()"
56 | nodeFieldDecl : (fnName : Name) -> (fieldName : String) -> (fieldType : TTImp) -> List Decl
57 | nodeFieldDecl fnName fieldName fieldType = [ foreignDecl, fnDecl, fnDef ]
60 | nodeCode = "node:lambda: (tyx, x) => \{fieldConvert fieldType $ "x." <+> fieldName}"
62 | foreignFnOpt : FnOpt
63 | foreignFnOpt = ForeignFn [ IApp EmptyFC (IVar EmptyFC (basic "fromString")) (IPrimVal EmptyFC $
Str nodeCode) ]
66 | foreignName = basic "ffi_\{fieldName}"
69 | foreignDecl = IClaim $
NoFC $
MkIClaimData MW Private [foreignFnOpt]
70 | $
MkTy EmptyFC (NoFC foreignName)
71 | $
IPi EmptyFC MW ExplicitArg Nothing (IBindVar EmptyFC $
basic "a") fieldType
74 | fnDecl = IClaim $
NoFC $
MkIClaimData MW Export []
75 | $
MkTy EmptyFC (NoFC fnName)
76 | $
IPi EmptyFC MW ExplicitArg Nothing (IBindVar EmptyFC $
basic "a") fieldType
79 | fnDef = IDef EmptyFC fnName
81 | (IApp EmptyFC (IVar EmptyFC fnName) (IBindVar EmptyFC $
basic "a"))
82 | (IApp EmptyFC (IVar EmptyFC foreignName) (IVar EmptyFC (basic "a")))
86 | mkNodeField : (fnName : Name) -> (fieldName : String) -> (fieldType: TTImp) -> Elab ()
87 | mkNodeField fnName fName fType = declare $
nodeFieldDecl fnName fName fType
90 | nodeFieldIODecl : (fnName : Name) -> (fieldName : String) -> (fieldType : TTImp) -> List Decl
91 | nodeFieldIODecl fnName fieldName fieldType = [ foreignDecl, fnDecl, fnDef ]
94 | nodeCode = "node:lambda: (tyx, x) => \{fieldConvert fieldType $ "x." <+> fieldName}"
96 | foreignFnOpt : FnOpt
97 | foreignFnOpt = ForeignFn [ IApp EmptyFC (IVar EmptyFC (basic "fromString")) (IPrimVal EmptyFC $
Str nodeCode) ]
100 | foreignName = basic "ffi_\{fieldName}"
103 | foreignDecl = IClaim $
NoFC $
MkIClaimData MW Private [foreignFnOpt]
104 | $
MkTy EmptyFC (NoFC foreignName)
105 | $
IPi EmptyFC MW ExplicitArg Nothing (IBindVar EmptyFC $
basic "a")
106 | $
IApp EmptyFC (IVar EmptyFC $
basic "PrimIO") fieldType
109 | fnDecl = IClaim $
NoFC $
MkIClaimData MW Export []
110 | $
MkTy EmptyFC (NoFC fnName)
111 | $
IPi EmptyFC MW AutoImplicit Nothing (IApp EmptyFC (IVar EmptyFC $
basic "HasIO") (IBindVar EmptyFC $
basic "io"))
112 | $
IPi EmptyFC MW ExplicitArg Nothing (IBindVar EmptyFC $
basic "a")
113 | $
IApp EmptyFC (IBindVar EmptyFC $
basic "io") fieldType
116 | fnDef = IDef EmptyFC fnName
117 | [ PatClause EmptyFC
118 | (IApp EmptyFC (IVar EmptyFC fnName) (IBindVar EmptyFC $
basic "a"))
119 | (IApp EmptyFC (IVar EmptyFC $
basic "primIO") $
IApp EmptyFC (IVar EmptyFC foreignName) (IVar EmptyFC (basic "a")))
123 | mkNodeFieldIO : (fnName : Name) -> (fieldName : String) -> (fieldType : TTImp) -> Elab ()
124 | mkNodeFieldIO fnName fieldName fieldType = declare $
nodeFieldIODecl fnName fieldName fieldType