aboutsummaryrefslogtreecommitdiff
path: root/stdlib/source/library/lux/abstract/enum.lux
blob: fd9e19e37187ab65c7be285f4d47868fc6b7a029 (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
(.using
 [library
  [lux "*"]]
 [//
  ["[0]" order {"+" Order}]])

(type: .public (Enum e)
  (Interface
   (is (Order e) &order)
   (is (-> e e) succ)
   (is (-> e e) pred)))

(def: .public (range enum from to)
  (All (_ a) (-> (Enum a) a a (List a)))
  (let [(open "/#[0]") enum]
    (loop [end to
           output (`` (is (List (~~ (type_of from)))
                          {.#End}))]
      (cond (/#< end from)
            (again (/#pred end) {.#Item end output})

            (/#< from end)
            (again (/#succ end) {.#Item end output})

            ... (= end from)
            {.#Item end output}))))