aboutsummaryrefslogtreecommitdiffstats
path: root/subsystem/karuta/rnt.lfe
diff options
context:
space:
mode:
Diffstat (limited to 'subsystem/karuta/rnt.lfe')
-rw-r--r--subsystem/karuta/rnt.lfe26
1 files changed, 26 insertions, 0 deletions
diff --git a/subsystem/karuta/rnt.lfe b/subsystem/karuta/rnt.lfe
new file mode 100644
index 0000000..dc0fbb7
--- /dev/null
+++ b/subsystem/karuta/rnt.lfe
@@ -0,0 +1,26 @@
+;; Tuples of an RNT relation, as Translator.ml writes and reads them: a
+;; tuple is #(Type #m(Name Value ...)), its type, names and strings
+;; binaries, and its integers no wider than an OCaml int.
+(defmodule rnt
+ (export (recv 1) (send 1)))
+
+;; A tuple from the bytes RNT sent.
+(defun recv (bytes) (holdable (binary_to_term bytes '(safe))))
+
+;; The bytes RNT reads a tuple from.
+(defun send (tuple) (term_to_binary (holdable tuple)))
+
+;; The tuple, if RNT can hold it.
+(defun holdable
+ (((= (tuple type attributes) tuple)) (when (is_binary type) (is_map attributes))
+ (if (lists:all (fun attribute? 1) (maps:to_list attributes))
+ tuple
+ (error 'badarg (list tuple))))
+ ((tuple) (error 'badarg (list tuple))))
+
+(defun attribute?
+ (((tuple name value)) (when (is_binary name) (is_binary value)) 'true)
+ (((tuple name value))
+ (when (is_binary name) (is_integer value) (>= value (- (bsl 1 62))) (< value (bsl 1 62)))
+ 'true)
+ ((_) 'false))