(;module: {#;doc "Functionality for working with variants (particularly 2-variants)."} lux) ## [Values] (do-template [ ] [(def: #export ( value) (All [a b] (-> (| a b))) ( value))] [left a +0] [right b +1]) (def: #export (either f g s) (All [a b c] (-> (-> a c) (-> b c) (| a b) c)) (case s (+0 x) (f x) (+1 x) (g x))) (do-template [ ] [(def: #export ( es) (All [a b] (-> (List (| a b)) (List ))) (case es #;Nil #;Nil (#;Cons ( x) es') (#;Cons [x ( es')]) (#;Cons _ es') ( es')))] [lefts a +0] [rights b +1] ) (def: #export (partition xs) (All [a b] (-> (List (| a b)) [(List a) (List b)])) (case xs #;Nil [#;Nil #;Nil] (#;Cons x xs') (let [[lefts rights] (partition xs')] (case x (+0 x') [(#;Cons x' lefts) rights] (+1 x') [lefts (#;Cons x' rights)]))))