aboutsummaryrefslogtreecommitdiff
path: root/source/lux/data/maybe.lux
blob: bba85daf7530e3c995130e5c0d2da285cd54cdc5 (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
##   Copyright (c) Eduardo Julian. All rights reserved.
##   The use and distribution terms for this software are covered by the
##   Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
##   which can be found in the file epl-v10.html at the root of this distribution.
##   By using this software in any fashion, you are agreeing to be bound by
##   the terms of this license.
##   You must not remove this notice, or any other, from this software.

(;import lux
         (lux (meta macro
                    ast)
              (control (monoid #as m #refer #all)
                       (functor #as F #refer #all)
                       (monad #as M #refer #all)))
         (.. list))

## [Types]
## (deftype (Maybe a)
##   (| #;None
##      (#;Some a)))

## [Structures]
(defstruct #export Maybe/Monoid (Monoid Maybe)
  (def m;unit #;None)
  (def (m;++ xs ys)
    (case xs
      #;None     ys
      (#;Some x) (#;Some x))))

(defstruct #export Maybe/Functor (Functor Maybe)
  (def (F;map f ma)
    (case ma
      #;None     #;None
      (#;Some a) (#;Some (f a)))))

(defstruct #export Maybe/Monad (Monad Maybe)
  (def M;_functor Maybe/Functor)

  (def (M;wrap x)
    (#;Some x))

  (def (M;join mma)
    (case mma
      #;None      #;None
      (#;Some xs) xs)))

## [Syntax]
(defmacro #export (? tokens state)
  (case tokens
    (\ (list maybe else))
    (let [g!value (symbol$ ["" "_"])]
      (#;Right state (list (` (case (~ maybe)
                                (#;Some (~ g!value))
                                (~ g!value)

                                _
                                (~ else))))))
    
    _
    (#;Left "Wrong syntax for ?")))