open Utilities.Result let value_of = function Ast.Str s -> Value.String s | Ast.Int n -> Value.Integer n let map_of bindings = List.to_seq bindings |> Utilities.StringMap.of_seq let execute (ctx : Sublanguage_context.t) statement = let* {RNT.branch; _} = ctx.session#state in let relation = Drl.Executor.relation_path ("\\branch\\" ^ branch) in let* message = match statement with | Ast.Define {target; heading; tuples} -> let* path = relation target in let tuples = List.map (fun row -> List.map (fun (a, v) -> a, value_of v) row |> map_of) tuples in let* () = RNT.create ctx.kernel path (RNT.Relation {heading= map_of heading; tuples}) in Ok ("Defined " ^ target) | Ast.Drop {target} -> let* path = relation target in let* () = RNT.remove ctx.kernel path in Ok ("Dropped " ^ target) in let* () = ctx.session#set_branch_to branch in Ok (Sublanguage_types.Transition message)