(.module: [lux (#- Type) [abstract ["." monad (#+ do)]] [control ["ex" exception (#+ exception:)]] [data [number ["n" nat]] [text ["%" format (#+ format)]] [collection ["." list]]] [target [jvm ["." type (#+ Type) ["." category (#+ Void Value Return Primitive Object Class Array Var Parameter Method)] ["." descriptor (#+ Descriptor)] ["." signature (#+ Signature)]]]] [tool [compiler ["." phase] [meta [archive (#+ Archive)]] [language [lux [synthesis (#+ Synthesis)]]]]]] [luxc [lang [host [jvm (#+ Inst Operation Phase Generator) ["_" inst]]]]] ["." // ["#." runtime]]) (exception: #export (not-a-tuple {size Nat}) (ex.report ["Expected size" ">= 2"] ["Actual size" (%.nat size)])) (def: #export (tuple generate archive members) (Generator (List Synthesis)) (do {@ phase.monad} [#let [size (list.size members)] _ (phase.assert not-a-tuple size (n.>= 2 size)) membersI (|> members list.enumerate (monad.map @ (function (_ [idx member]) (do @ [memberI (generate archive member)] (wrap (|>> _.DUP (_.int (.int idx)) memberI _.AASTORE))))) (:: @ map _.fuse))] (wrap (|>> (_.int (.int size)) (_.array //runtime.$Value) membersI)))) (def: (flagI right?) (-> Bit Inst) (if right? (_.string "") _.NULL)) (def: #export (variant generate archive [lefts right? member]) (Generator [Nat Bit Synthesis]) (do phase.monad [memberI (generate archive member)] (wrap (|>> (_.int (.int (if right? (.inc lefts) lefts))) (flagI right?) memberI (_.INVOKESTATIC //.$Runtime "variant_make" (type.method [(list //runtime.$Tag //runtime.$Flag //runtime.$Value) //.$Variant (list)]))))))