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