(.module: [library [lux "*" [abstract [equivalence {"+" [Equivalence]}] [monad {"+" [do]}]] [control ["<>" parser ["<.>" xml {"+" [Parser]}] ["<.>" text]]] [data ["." product] [format ["." xml {"+" [XML]}]]]]] ["." // "_" ["#." time {"+" [Time]}] ["#." 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)))