aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/library/lux/control/remember.lux
blob: b2db48900bed62c3a388c1bbc47d0dbaaec199d5 (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
(.module:
  [library
   [lux "*"
    [abstract
     [monad {"+" [do]}]]
    [control
     ["[0]" io]
     ["[0]" try]
     ["[0]" exception {"+" [exception:]}]
     ["<>" parser ("[1]\[0]" functor)
      ["<c>" code {"+" [Parser]}]]]
    [data
     ["[0]" text
      ["%" format {"+" [format]}]]]
    [time
     ["[0]" instant]
     ["[0]" date {"+" [Date]} ("[1]\[0]" order)]]
    ["[0]" meta]
    [macro
     ["[0]" code]
     ["[0]" template]
     [syntax {"+" [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)
  ($_ <>.either
      (<>\each (|>> instant.of_millis instant.date)
               <c>.int)
      (do <>.monad
        [raw <c>.text]
        (case (\ 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"]
  )