aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/library/lux/meta/compiler/target/jvm/encoding/signed.lux
diff options
context:
space:
mode:
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.lux114
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]
+ )
+ )