(.module: [library [lux "*" [abstract ["." equivalence {"+" [Equivalence]}] ["." monoid {"+" [Monoid]}]] [control ["." try] ["<>" parser ["<.>" code]]] [data [format [".F" binary {"+" [Writer]}]]] [macro {"+" [with_identifiers]} [syntax {"+" [syntax:]}] ["." code]] [math ["." number {"+" [hex]} ["." i64]]] [type abstract]]] ["." // "_" [encoding ["#." unsigned]]]) (abstract: .public (Modifier of) {} //unsigned.U2 (def: .public code (-> (Modifier Any) //unsigned.U2) (|>> :representation)) (implementation: .public equivalence (All (_ of) (Equivalence (Modifier of))) (def: (= reference sample) (\ //unsigned.equivalence = (:representation reference) (:representation sample)))) (template: (!wrap value) [(|> value //unsigned.u2 try.trusted :abstraction)]) (template: (!unwrap value) [(|> value :representation //unsigned.value)]) (def: .public (has? sub super) (All (_ of) (-> (Modifier of) (Modifier of) Bit)) (let [sub (!unwrap sub)] (|> (!unwrap super) (i64.and sub) (\ i64.equivalence = sub)))) (implementation: .public monoid (All (_ of) (Monoid (Modifier of))) (def: identity (!wrap (hex "0000"))) (def: (composite left right) (!wrap (i64.or (!unwrap left) (!unwrap right))))) (def: .public empty Modifier (\ ..monoid identity)) (def: .public writer (All (_ of) (Writer (Modifier of))) (|>> :representation //unsigned.writer/2)) (def: modifier (-> Nat Modifier) (|>> !wrap)) ) (syntax: .public (modifiers: [ofT .any options (<>.many .any)]) (with_identifiers [g!modifier g!code] (in (list (` (template [(~ g!code) (~ g!modifier)] [(def: (~' .public) (~ g!modifier) (..Modifier (~ ofT)) ((~! ..modifier) ((~! number.hex) (~ g!code))))] (~+ options)))))))