(.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])) (// [".T" common])) (exception: #export (Not-A-Tuple {message Text}) message) (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)))))