blob: 02e6c50113fc546f53ed9bd30226a38817184047 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
(.using
[library
[lux (.except)
[abstract
[monad (.only do)]]
[control
["[0]" io]
["[0]" try]
["[0]" exception (.only exception:)]
["<>" parser (.open: "[1]#[0]" functor)
["<c>" code (.only Parser)]]]
[data
["[0]" text
["%" format (.only format)]]]
[time
["[0]" instant]
["[0]" date (.only Date) (.open: "[1]#[0]" order)]]
["[0]" meta]
[macro
["[0]" code]
["[0]" template]
[syntax (.only 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)
(all <>.either
(<>#each (|>> instant.of_millis instant.date)
<c>.int)
(do <>.monad
[raw <c>.text]
(case (at date.codec decoded raw)
{try.#Success date}
(in date)
{try.#Failure message}
(<>.failure message)))))
(syntax: .public (remember [deadline ..deadline
message <c>.text
focus (<>.maybe <c>.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 [<name> <message>]
[(`` (syntax: .public (<name> [deadline ..deadline
message <c>.text
focus (<>.maybe <c>.any)])
(in (list (` (..remember (~ (code.text (%.date deadline)))
(~ (code.text (format <message> " " message)))
(~+ (case focus
{.#Some focus}
(list focus)
{.#None}
(list)))))))))]
[to_do "TODO"]
[fix_me "FIXME"]
)
|