(.module: [lux #* [abstract [monad (#+ do)]] [control ["<>" parser ["<.>" text (#+ Parser)]]] [data [text ["%" format]]] [math [number ["n" nat]]] [time ["." date (#+ Date)] ["." year] ["." month]]]) (def: #export (pad value) (-> Nat Text) (if (n.< 10 value) (%.format "0" (%.nat value)) (%.nat value))) (def: #export (format value) (%.Format Date) (%.format (|> value date.year year.value .nat %.nat) (|> value date.month month.number ..pad) (|> value date.day_of_month ..pad))) (def: #export parser (Parser Date) (do <>.monad [year (<>.codec n.decimal (.exactly 4 .decimal)) year (<>.lift (year.year (.int year))) month (<>.codec n.decimal (.exactly 2 .decimal)) month (<>.lift (month.by_number month)) day_of_month (<>.codec n.decimal (.exactly 2 .decimal))] (<>.lift (date.date year month day_of_month))))