aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/library/lux/time/day.lux
blob: 157dd6c1f3b18e81a362b7ef8593161dc8bdb447 (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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
(.module:
  [library
   [lux (#- nat)
    [abstract
     [equivalence (#+ Equivalence)]
     [order (#+ Order)]
     [enum (#+ Enum)]
     [codec (#+ Codec)]]
    [control
     ["." try]
     ["." exception (#+ exception:)]]
    [data
     ["." text]]
    [macro
     ["." template]]
    [math
     [number
      ["n" nat]]]]])

(type: #export Day
  #Sunday
  #Monday
  #Tuesday
  #Wednesday
  #Thursday
  #Friday
  #Saturday)

(implementation: #export equivalence
  (Equivalence Day)
  
  (def: (= reference sample)
    (case [reference sample]
      (^template [<tag>]
        [[<tag> <tag>]
         #1])
      ([#Sunday]
       [#Monday]
       [#Tuesday]
       [#Wednesday]
       [#Thursday]
       [#Friday]
       [#Saturday])

      _
      #0)))

(def: (nat day)
  (-> Day Nat)
  (case day
    #Sunday    0
    #Monday    1
    #Tuesday   2
    #Wednesday 3
    #Thursday  4
    #Friday    5
    #Saturday  6))

(implementation: #export order
  (Order Day)
  
  (def: &equivalence ..equivalence)
  
  (def: (< reference sample)
    (n.< (..nat reference) (..nat sample))))

(implementation: #export enum
  (Enum Day)
  
  (def: &order ..order)
  
  (def: (succ day)
    (case day
      #Sunday    #Monday
      #Monday    #Tuesday
      #Tuesday   #Wednesday
      #Wednesday #Thursday
      #Thursday  #Friday
      #Friday    #Saturday
      #Saturday  #Sunday))
  
  (def: (pred day)
    (case day
      #Monday    #Sunday
      #Tuesday   #Monday
      #Wednesday #Tuesday
      #Thursday  #Wednesday
      #Friday    #Thursday
      #Saturday  #Friday
      #Sunday    #Saturday)))

(exception: #export (not_a_day_of_the_week {value Text})
  (exception.report
   ["Value" (text.format value)]))

(implementation: #export codec
  (Codec Text Day)
  
  (def: (encode value)
    (case value
      (^template [<tag>]
        [<tag> (template.text [<tag>])])
      ([#..Monday]
       [#..Tuesday]
       [#..Wednesday]
       [#..Thursday]
       [#..Friday]
       [#..Saturday]
       [#..Sunday])))
  (def: (decode value)
    (case value
      (^template [<tag>]
        [(^ (template.text [<tag>])) (#try.Success <tag>)])
      ([#..Monday]
       [#..Tuesday]
       [#..Wednesday]
       [#..Thursday]
       [#..Friday]
       [#..Saturday]
       [#..Sunday])
      _ (exception.throw ..not_a_day_of_the_week [value]))))