(.module: [library [lux "*" [abstract [equivalence {"+" Equivalence}] [monad {"+" do}]] [control ["<>" parser ["<[0]>" xml {"+" Parser}] ["<[0]>" text]]] [data ["[0]" product] [format ["[0]" xml {"+" XML}]]]]] ["[0]" // "_" ["[1][0]" time {"+" Time}] ["[1][0]" build {"+" Build}]]) (type: .public Stamp (Record [#time Time #build Build])) (def: .public equivalence (Equivalence Stamp) ($_ product.equivalence //time.equivalence //build.equivalence )) (def: xml.Tag ["" "timestamp"]) (def: time_format (-> Time XML) (|>> //time.format {xml.#Text} list {xml.#Node .. xml.attributes})) (def: .public (format (^open "_[0]")) (-> Stamp (List XML)) (list (..time_format _#time) (//build.format _#build))) (def: time_parser (Parser Time) (<| (.node ) (.then //time.parser) .text)) (def: .public parser (Parser Stamp) (<>.and (.somewhere ..time_parser) (.somewhere //build.parser)))