(.module: [library [lux (#- Type) [abstract [equivalence (#+ Equivalence)] [monad (#+ do)]] [control ["<>" parser ["<.>" xml (#+ Parser)] ["<.>" text]]] [data ["." product] ["." text] [format ["." xml (#+ XML)]]]]] ["." /// #_ ["#." type (#+ Type)] ["#." time (#+ Time)]]) (type: #export Version {#extension Type #value Text #updated Time}) (def: #export equivalence (Equivalence Version) ($_ product.equivalence text.equivalence text.equivalence ///time.equivalence )) (template [ ] [(def: xml.Tag ["" ])] [ "extension"] [ "value"] [ "updated"] [ "snapshotVersion"] ) (def: (format_text tag value) (-> xml.Tag Text XML) (|> value #xml.Text list (#xml.Node tag xml.attributes))) (def: #export (format (^slots [#extension #value #updated])) (-> Version XML) (<| (#xml.Node .. xml.attributes) (list (..format_text .. extension) (..format_text .. value) (..format_text .. (///time.format updated))))) (def: (text tag) (-> xml.Tag (Parser Text)) (<| (.node tag) .text)) (def: #export parser (Parser Version) (<| (.node ..) ($_ <>.and (.somewhere (..text ..)) (.somewhere (..text ..)) (.somewhere (.embed ///time.parser (..text ..))) )))