blob: 96805ad81cd801f92bdde928c176e1682c96b06a (
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
83
|
(.require
[library
[lux (.except)
[abstract
[monad (.only do)]]
[control
["<>" parser (.use "[1]#[0]" functor)]
["[0]" io]
["[0]" try]
["[0]" exception (.only Exception)]]
[data
["[0]" text
["%" \\format (.only format)]]]
["[0]" meta (.only)
["[0]" code (.only)
["<[1]>" \\parser (.only Parser)]]
[macro
[syntax (.only syntax)]
["[0]" template]]]
[world
[time
["[0]" instant]
["[0]" date (.only Date) (.use "[1]#[0]" order)]]]]])
(exception.def .public (must_remember [deadline today message focus])
(Exception [Date Date Text (Maybe Code)])
(exception.report
(list ["Deadline" (%.date deadline)]
["Today" (%.date today)]
["Message" message]
["Code" (when focus
{.#Some focus}
(%.code focus)
{.#None}
"")])))
(def deadline
(Parser Date)
(all <>.either
(<>#each (|>> instant.of_millis instant.date)
<code>.int)
(do <>.monad
[raw <code>.text]
(when (of date.codec decoded raw)
{try.#Success date}
(in date)
{try.#Failure message}
(<>.failure message)))))
(def .public remember
(syntax (_ [deadline ..deadline
message <code>.text
focus (<>.maybe <code>.any)])
(let [now (io.run! instant.now)
today (instant.date now)]
(if (date#< deadline today)
(in (when focus
{.#Some focus}
(list focus)
{.#None}
(list)))
(meta.failure (exception.error ..must_remember [deadline today message focus]))))))
(with_template [<name> <message>]
[(`` (def .public <name>
(syntax (_ [deadline ..deadline
message <code>.text
focus (<>.maybe <code>.any)])
(in (list (` (..remember (, (code.text (%.date deadline)))
(, (code.text (format <message> " " message)))
(,* (when focus
{.#Some focus}
(list focus)
{.#None}
(list))))))))))]
[to_do "TODO"]
[fix_me "FIXME"]
)
|