diff options
Diffstat (limited to 'subsystem/karuta/rnt.lfe')
| -rw-r--r-- | subsystem/karuta/rnt.lfe | 26 |
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)) |
