aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/library/lux/target/jvm/bytecode/address.lux
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib/source/library/lux/target/jvm/bytecode/address.lux')
-rw-r--r--stdlib/source/library/lux/target/jvm/bytecode/address.lux74
1 files changed, 74 insertions, 0 deletions
diff --git a/stdlib/source/library/lux/target/jvm/bytecode/address.lux b/stdlib/source/library/lux/target/jvm/bytecode/address.lux
new file mode 100644
index 000000000..8d51a8597
--- /dev/null
+++ b/stdlib/source/library/lux/target/jvm/bytecode/address.lux
@@ -0,0 +1,74 @@
+(.module:
+ [library
+ [lux #*
+ [abstract
+ [equivalence (#+ Equivalence)]
+ [monad (#+ do)]]
+ [control
+ ["." try (#+ Try)]]
+ [data
+ [format
+ [binary (#+ Writer)]]
+ [text
+ ["%" format (#+ Format)]]]
+ [math
+ [number
+ ["n" nat]]]
+ [type
+ abstract]]]
+ ["." // #_
+ [jump (#+ Big_Jump)]
+ ["/#" // #_
+ [encoding
+ ["#." unsigned (#+ U2)]
+ ["#." signed (#+ S4)]]]])
+
+(abstract: #export Address
+ U2
+
+ (def: #export value
+ (-> Address U2)
+ (|>> :representation))
+
+ (def: #export start
+ Address
+ (|> 0 ///unsigned.u2 try.assume :abstraction))
+
+ (def: #export (move distance)
+ (-> U2 (-> Address (Try Address)))
+ (|>> :representation
+ (///unsigned.+/2 distance)
+ (\ try.functor map (|>> :abstraction))))
+
+ (def: with_sign
+ (-> Address (Try S4))
+ (|>> :representation ///unsigned.value .int ///signed.s4))
+
+ (def: #export (jump from to)
+ (-> Address Address (Try Big_Jump))
+ (do try.monad
+ [from (with_sign from)
+ to (with_sign to)]
+ (///signed.-/4 from to)))
+
+ (def: #export (after? reference subject)
+ (-> Address Address Bit)
+ (n.> (|> reference :representation ///unsigned.value)
+ (|> subject :representation ///unsigned.value)))
+
+ (implementation: #export equivalence
+ (Equivalence Address)
+
+ (def: (= reference subject)
+ (\ ///unsigned.equivalence =
+ (:representation reference)
+ (:representation subject))))
+
+ (def: #export writer
+ (Writer Address)
+ (|>> :representation ///unsigned.writer/2))
+
+ (def: #export format
+ (Format Address)
+ (|>> :representation ///unsigned.value %.nat))
+ )