aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/library/lux/documentation/remember.lux
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"]
  )