-
Notifications
You must be signed in to change notification settings - Fork 0
/
val_any.go
76 lines (69 loc) · 1.61 KB
/
val_any.go
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
package lit
import (
"xelf.org/xelf/ast"
"xelf.org/xelf/bfr"
"xelf.org/xelf/typ"
)
func Wrap(m Mut, t typ.Type) *typ.Wrap {
return &typ.Wrap{Typ: t, Val: m, OK: !m.Nil()}
}
func AnyWrap(t typ.Type) *typ.Wrap {
return &typ.Wrap{Typ: t, Val: &Any{}}
}
func ZeroWrap(t typ.Type) Mut {
v := Zero(t)
if v.Type() == t {
return v
}
return Wrap(v, t)
}
type Any struct{ Val }
func (w *Any) Unwrap() Val {
if w.Val == nil {
return Null{}
}
return w.Val
}
func (w *Any) Type() typ.Type {
if w.Val == nil || w.Val.Type() == typ.None {
return typ.Any
}
return w.Unwrap().Type()
}
func (w *Any) Nil() bool { return w.Val == nil || w.Val.Nil() }
func (w *Any) Zero() bool { return w.Val == nil || w.Val.Zero() }
func (w *Any) Mut() Mut { return w }
func (w *Any) Value() Val { return w.Unwrap().Value() }
func (w *Any) As(t typ.Type) (Val, error) {
if w.Val != nil {
return w.Val.As(t)
}
return Wrap(w, t), nil
}
func (w *Any) Print(p *bfr.P) error { return w.Unwrap().Print(p) }
func (w *Any) String() string { return w.Unwrap().String() }
func (w *Any) MarshalJSON() ([]byte, error) { return w.Unwrap().MarshalJSON() }
func (w *Any) UnmarshalJSON(b []byte) error { return unmarshal(b, w) }
func (w *Any) New() Mut { return &Any{} }
func (w *Any) Ptr() interface{} {
if m, ok := w.Val.(Mut); ok {
return m.Ptr()
}
return nil
}
func (w *Any) Parse(a ast.Ast) (err error) {
w.Val, err = ParseMut(a)
return err
}
func (w *Any) Assign(v Val) error {
switch v.(type) {
case nil:
w.Val = nil
case Null:
w.Val = nil
default:
w.Val = v
}
return nil
}
func init() { typ.WrapNull = AnyWrap }