diff options
Diffstat (limited to 'stdlib/source/library/lux/meta/compiler/target/jvm/encoding/signed.lux')
-rw-r--r-- | stdlib/source/library/lux/meta/compiler/target/jvm/encoding/signed.lux | 114 |
1 files changed, 114 insertions, 0 deletions
diff --git a/stdlib/source/library/lux/meta/compiler/target/jvm/encoding/signed.lux b/stdlib/source/library/lux/meta/compiler/target/jvm/encoding/signed.lux new file mode 100644 index 000000000..428f5ef8a --- /dev/null +++ b/stdlib/source/library/lux/meta/compiler/target/jvm/encoding/signed.lux @@ -0,0 +1,114 @@ +(.require + [library + [lux (.except int) + [abstract + [equivalence (.only Equivalence)] + [order (.only Order)]] + [control + ["[0]" try (.only Try)] + ["[0]" exception (.only Exception)]] + [data + [text + ["%" \\format (.only format)]] + [binary + ["[0]" \\format (.only Format)]]] + [math + [number + ["[0]" i64] + ["n" nat] + ["i" int]]] + [meta + [macro + ["[0]" template]] + [type + ["[0]" nominal (.except def)]]]]]) + +(nominal.def .public (Signed brand) + Int + + (def .public value + (-> (Signed Any) Int) + (|>> representation)) + + (def .public equivalence + (All (_ brand) (Equivalence (Signed brand))) + (implementation + (def (= reference sample) + (i.= (representation reference) (representation sample))))) + + (def .public order + (All (_ brand) (Order (Signed brand))) + (implementation + (def equivalence ..equivalence) + (def (< reference sample) + (i.< (representation reference) (representation sample))))) + + (exception.def .public (value_exceeds_the_scope [value scope]) + (Exception [Int Nat]) + (exception.report + (list ["Value" (%.int value)] + ["Scope (in bytes)" (%.nat scope)]))) + + (with_template [<bytes> <name> <size> <constructor> <maximum> <minimum> <+> <->] + [(with_expansions [<raw> (template.symbol [<name> "'"])] + (nominal.def <raw> Any) + (type .public <name> (Signed <raw>))) + + (def .public <size> <bytes>) + + (def .public <maximum> + <name> + (|> <bytes> (n.* i64.bits_per_byte) -- i64.mask abstraction)) + + (def .public <minimum> + <name> + (let [it (representation <maximum>)] + (abstraction (-- (i.- it +0))))) + + (def .public <constructor> + (-> Int (Try <name>)) + (let [positive (representation <maximum>) + negative (i64.not positive)] + (function (_ value) + (if (i.= (if (i.< +0 value) + (i64.or negative value) + (i64.and positive value)) + value) + {try.#Success (abstraction value)} + (exception.except ..value_exceeds_the_scope [value <size>]))))) + + (with_template [<abstract_operation> <concrete_operation>] + [(def .public (<abstract_operation> parameter subject) + (-> <name> <name> (Try <name>)) + (<constructor> + (<concrete_operation> (representation parameter) + (representation subject))))] + + [<+> i.+] + [<-> i.-] + )] + + [1 S1 bytes/1 s1 maximum/1 minimum/1 +/1 -/1] + [2 S2 bytes/2 s2 maximum/2 minimum/2 +/2 -/2] + [4 S4 bytes/4 s4 maximum/4 minimum/4 +/4 -/4] + ) + + (with_template [<name> <from> <to>] + [(def .public <name> + (-> <from> <to>) + (|>> transmutation))] + + [lifted/2 S1 S2] + [lifted/4 S2 S4] + ) + + (with_template [<format_name> <type> <format>] + [(def .public <format_name> + (Format <type>) + (|>> representation <format>))] + + [format/1 S1 \\format.bits_8] + [format/2 S2 \\format.bits_16] + [format/4 S4 \\format.bits_32] + ) + ) |