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