aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/library/lux/control/remember.lux
blob: 264d13adbcae45397de32c2a7a7c95c1d6c614d5 (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
84
(.require
 [library
  [lux (.except)
   [abstract
    [monad (.only do)]]
   [control
    ["[0]" io]
    ["[0]" try]
    ["[0]" exception (.only exception)]
    ["<>" parser (.use "[1]#[0]" functor)
     ["<c>" code (.only Parser)]]]
   [data
    ["[0]" text
     ["%" \\format (.only format)]]]
   [time
    ["[0]" instant]
    ["[0]" date (.only Date) (.use "[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)))))

(def .public remember
  (syntax (_ [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]))))))

(with_template [<name> <message>]
  [(`` (def .public <name>
         (syntax (_ [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"]
  )