(.module: [lux #* [control [monad (#+ do)] ["ex" exception (#+ exception:)]] [data [text format] [collection ["." list]]] [language ["." compiler [synthesis (#+ Synthesis)]]]] [luxc [lang [host ["." jvm (#+ Inst Operation Compiler) ["$t" type] ["$i" inst]]]]] [//]) (exception: #export (not-a-tuple {size Nat}) (ex.report ["Expected size" ">= 2"] ["Actual size" (%n size)])) (def: $Object jvm.Type ($t.class "java.lang.Object" (list))) (def: #export (tuple translate members) (-> Compiler (List Synthesis) (Operation Inst)) (do compiler.Monad [#let [size (list.size members)] _ (compiler.assert not-a-tuple size (n/>= +2 size)) membersI (|> members list.enumerate (monad.map @ (function (_ [idx member]) (do @ [memberI (translate member)] (wrap (|>> $i.DUP ($i.int (.int idx)) memberI $i.AASTORE))))) (:: @ map $i.fuse))] (wrap (|>> ($i.int (.int size)) ($i.array $Object) membersI)))) (def: (flagI tail?) (-> Bit Inst) (if tail? ($i.string "") $i.NULL)) (def: #export (variant translate tag tail? member) (-> Compiler Nat Bit Synthesis (Operation Inst)) (do compiler.Monad [memberI (translate member)] (wrap (|>> ($i.int (.int tag)) (flagI tail?) memberI ($i.INVOKESTATIC //.runtime-class "variant_make" ($t.method (list $t.int $Object $Object) (#.Some ($t.array +1 $Object)) (list)) #0)))))