(;module: lux (lux (control [monad #+ do] ["ex" exception #+ exception:]) (data text/format (coll [list])) [macro] [host #+ do-to]) (luxc ["&" lang] (lang [";L" host] (host ["$" jvm] (jvm ["$t" type] ["$d" def] ["$i" inst])) ["la" analysis] ["ls" synthesis] (translation [";T" common])))) (exception: #export Not-A-Tuple) (def: $Object $;Type ($t;class "java.lang.Object" (list))) (def: #export (translate-tuple translate members) (-> (-> ls;Synthesis (Meta $;Inst)) (List ls;Synthesis) (Meta $;Inst)) (do macro;Monad [#let [size (list;size members)] _ (&;assert Not-A-Tuple (%code (` [(~@ members)])) (n.>= +2 size)) membersI (|> members list;enumerate (monad;map @ (function [[idx member]] (do @ [memberI (translate member)] (wrap (|>. $i;DUP ($i;int (nat-to-int idx)) memberI $i;AASTORE))))) (:: @ map $i;fuse))] (wrap (|>. ($i;int (nat-to-int size)) ($i;array $Object) membersI)))) (def: (flagI tail?) (-> Bool $;Inst) (if tail? ($i;string "") $i;NULL)) (def: #export (translate-variant translate tag tail? member) (-> (-> ls;Synthesis (Meta $;Inst)) Nat Bool ls;Synthesis (Meta $;Inst)) (do macro;Monad [memberI (translate member)] (wrap (|>. ($i;int (nat-to-int tag)) (flagI tail?) memberI ($i;INVOKESTATIC hostL;runtime-class "variant_make" ($t;method (list $t;int $Object $Object) (#;Some ($t;array +1 $Object)) (list)) false)))))