(.module: [library [lux "*" [abstract [monad {"+" do}]] [control ["[0]" io] ["[0]" try] ["[0]" exception {"+" exception:}] ["<>" parser ("[1]#[0]" functor) ["" code {"+" Parser}]]] [data ["[0]" text ["%" format {"+" format}]]] [time ["[0]" instant] ["[0]" date {"+" Date} ("[1]#[0]" order)]] ["[0]" meta] [macro ["[0]" code] ["[0]" template] [syntax {"+" syntax:}]]]]) (exception: .public (must_remember [deadline Date today Date message Text focus (Maybe Code)]) (exception.report ["Deadline" (%.date deadline)] ["Today" (%.date today)] ["Message" message] ["Code" (case focus {.#Some focus} (%.code focus) {.#None} "")])) (def: deadline (Parser Date) ($_ <>.either (<>#each (|>> instant.of_millis instant.date) .int) (do <>.monad [raw .text] (case (# date.codec decoded raw) {try.#Success date} (in date) {try.#Failure message} (<>.failure message))))) (syntax: .public (remember [deadline ..deadline message .text focus (<>.maybe .any)]) (let [now (io.run! instant.now) today (instant.date now)] (if (date#< deadline today) (in (case focus {.#Some focus} (list focus) {.#None} (list))) (meta.failure (exception.error ..must_remember [deadline today message focus]))))) (template [ ] [(`` (syntax: .public ( [deadline ..deadline message .text focus (<>.maybe .any)]) (in (list (` (..remember (~ (code.text (%.date deadline))) (~ (code.text (format " " message))) (~+ (case focus {.#Some focus} (list focus) {.#None} (list)))))))))] [to_do "TODO"] [fix_me "FIXME"] )