From 4bd2f378011bf28449ed907d637a7867524e3b4b Mon Sep 17 00:00:00 2001 From: Eduardo Julian Date: Thu, 2 Jul 2020 22:39:02 -0400 Subject: Now using the new syntax for variants (even though they still work the old way... for now) --- stdlib/source/poly/lux/abstract/equivalence.lux | 13 +++++++---- stdlib/source/poly/lux/abstract/functor.lux | 10 ++++++--- stdlib/source/poly/lux/data/format/json.lux | 30 ++++++++++++++++++------- 3 files changed, 38 insertions(+), 15 deletions(-) (limited to 'stdlib/source/poly') diff --git a/stdlib/source/poly/lux/abstract/equivalence.lux b/stdlib/source/poly/lux/abstract/equivalence.lux index 3ee6fb5c5..bb037c7cc 100644 --- a/stdlib/source/poly/lux/abstract/equivalence.lux +++ b/stdlib/source/poly/lux/abstract/equivalence.lux @@ -108,16 +108,21 @@ ## Variants (do @ [members (.variant (p.many equivalence)) - #let [g!_ (code.local-identifier "_____________") + #let [last (dec (list.size members)) + g!_ (code.local-identifier "_____________") g!left (code.local-identifier "_____________left") g!right (code.local-identifier "_____________right")]] (wrap (` (: (~ (@Equivalence inputT)) (function ((~ g!_) (~ g!left) (~ g!right)) (case [(~ g!left) (~ g!right)] (~+ (list@join (list@map (function (_ [tag g!eq]) - (list (` [((~ (code.nat tag)) (~ g!left)) - ((~ (code.nat tag)) (~ g!right))]) - (` ((~ g!eq) (~ g!left) (~ g!right))))) + (if (nat.= last tag) + (list (` [((~ (code.nat (dec tag))) #1 (~ g!left)) + ((~ (code.nat (dec tag))) #1 (~ g!right))]) + (` ((~ g!eq) (~ g!left) (~ g!right)))) + (list (` [((~ (code.nat tag)) #0 (~ g!left)) + ((~ (code.nat tag)) #0 (~ g!right))]) + (` ((~ g!eq) (~ g!left) (~ g!right)))))) (list.enumerate members)))) (~ g!_) #0)))))) diff --git a/stdlib/source/poly/lux/abstract/functor.lux b/stdlib/source/poly/lux/abstract/functor.lux index 4fdff71ef..7381cc0b8 100644 --- a/stdlib/source/poly/lux/abstract/functor.lux +++ b/stdlib/source/poly/lux/abstract/functor.lux @@ -51,11 +51,15 @@ ## Variants (do @ [_ (wrap []) - membersC (.variant (p.many (Arg valueC)))] + membersC (.variant (p.many (Arg valueC))) + #let [last (dec (list.size membersC))]] (wrap (` (case (~ valueC) (~+ (list;join (list;map (function (_ [tag memberC]) - (list (` ((~ (code.nat tag)) (~ valueC))) - (` ((~ (code.nat tag)) (~ memberC))))) + (if (n.= last tag) + (list (` ((~ (code.nat (dec tag))) #1 (~ valueC))) + (` ((~ (code.nat (dec tag))) #1 (~ memberC)))) + (list (` ((~ (code.nat tag)) #0 (~ valueC))) + (` ((~ (code.nat tag)) #0 (~ memberC)))))) (list.enumerate membersC)))))))) ## Tuples (do p.monad diff --git a/stdlib/source/poly/lux/data/format/json.lux b/stdlib/source/poly/lux/data/format/json.lux index d3a32b27a..b324790fb 100644 --- a/stdlib/source/poly/lux/data/format/json.lux +++ b/stdlib/source/poly/lux/data/format/json.lux @@ -165,14 +165,21 @@ (do @ [#let [g!_ (code.local-identifier "_______") g!input (code.local-identifier "_______input")] - members (.variant (p.many codec//encode))] + members (.variant (p.many codec//encode)) + #let [last (dec (list.size members))]] (wrap (` (: (~ (@JSON//encode inputT)) (function ((~ g!_) (~ g!input)) (case (~ g!input) (~+ (list@join (list@map (function (_ [tag g!encode]) - (list (` ((~ (code.nat tag)) (~ g!input))) - (` ((~! /.json) [(~ (code.frac (..tag tag))) - ((~ g!encode) (~ g!input))])))) + (if (n.= last tag) + (list (` ((~ (code.nat (dec tag))) #1 (~ g!input))) + (` ((~! /.json) [(~ (code.frac (..tag (dec tag)))) + #1 + ((~ g!encode) (~ g!input))]))) + (list (` ((~ (code.nat tag)) #0 (~ g!input))) + (` ((~! /.json) [(~ (code.frac (..tag tag))) + #0 + ((~ g!encode) (~ g!input))]))))) (list.enumerate members)))))))))) (do @ [g!encoders (.tuple (p.many codec//encode)) @@ -270,13 +277,20 @@ (wrap (` (: (~ (@JSON//decode inputT)) ((~! .array) ((~! p.some) (~ subC))))))) (do @ - [members (.variant (p.many codec//decode))] + [members (.variant (p.many codec//decode)) + #let [last (dec (list.size members))]] (wrap (` (: (~ (@JSON//decode inputT)) ($_ ((~! p.or)) (~+ (list@map (function (_ [tag memberC]) - (` (|> (~ memberC) - ((~! p.after) ((~! .number!) (~ (code.frac (..tag tag))))) - ((~! .array))))) + (if (n.= last tag) + (` (|> (~ memberC) + ((~! p.after) ((~! .number!) (~ (code.frac (..tag (dec tag)))))) + ((~! p.after) ((~! .boolean!) (~ (code.bit #1)))) + ((~! .array)))) + (` (|> (~ memberC) + ((~! p.after) ((~! .number!) (~ (code.frac (..tag tag))))) + ((~! p.after) ((~! .boolean!) (~ (code.bit #0)))) + ((~! .array)))))) (list.enumerate members)))))))) (do @ [g!decoders (.tuple (p.many codec//decode))] -- cgit v1.2.3