(.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 (^slots [#time #build])) (-> 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)))