-
Notifications
You must be signed in to change notification settings - Fork 153
/
function.go
124 lines (98 loc) · 2.84 KB
/
function.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
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
122
123
124
package values
import (
"context"
"regexp"
"github.com/influxdata/flux/semantic"
)
// Function represents a callable type
type Function interface {
Value
HasSideEffect() bool
Call(ctx context.Context, args Object) (Value, error)
}
// NewFunction returns a new function value.
// This function will panic if it is passed anything other than a function type.
func NewFunction(name string, typ semantic.MonoType, call func(ctx context.Context, args Object) (Value, error), sideEffect bool) *function {
if typ.Kind() != semantic.Fun {
panic("expected function type, but instead got " + typ.String())
}
return &function{
name: name,
t: typ,
call: call,
hasSideEffect: sideEffect,
}
}
// function implements Value interface and more specifically the Function interface
type function struct {
name string
t semantic.MonoType
call func(ctx context.Context, args Object) (Value, error)
hasSideEffect bool
}
func (f *function) Dynamic() Dynamic {
panic(UnexpectedKind(semantic.Function, semantic.Dynamic))
}
func (f *function) IsNull() bool {
return false
}
func (f *function) Type() semantic.MonoType {
return f.t
}
func (f *function) Str() string {
panic(UnexpectedKind(semantic.Function, semantic.String))
}
func (f *function) Bytes() []byte {
panic(UnexpectedKind(semantic.Function, semantic.Bytes))
}
func (f *function) Int() int64 {
panic(UnexpectedKind(semantic.Function, semantic.Int))
}
func (f *function) UInt() uint64 {
panic(UnexpectedKind(semantic.Function, semantic.UInt))
}
func (f *function) Float() float64 {
panic(UnexpectedKind(semantic.Function, semantic.Float))
}
func (f *function) Bool() bool {
panic(UnexpectedKind(semantic.Function, semantic.Bool))
}
func (f *function) Time() Time {
panic(UnexpectedKind(semantic.Function, semantic.Time))
}
func (f *function) Duration() Duration {
panic(UnexpectedKind(semantic.Function, semantic.Duration))
}
func (f *function) Regexp() *regexp.Regexp {
panic(UnexpectedKind(semantic.Function, semantic.Regexp))
}
func (f *function) Array() Array {
panic(UnexpectedKind(semantic.Function, semantic.Function))
}
func (f *function) Object() Object {
panic(UnexpectedKind(semantic.Function, semantic.Object))
}
func (f *function) Function() Function {
return f
}
func (f *function) Dict() Dictionary {
panic(UnexpectedKind(semantic.Function, semantic.Dictionary))
}
func (f *function) Vector() Vector {
panic(UnexpectedKind(semantic.Function, semantic.Vector))
}
func (f *function) Equal(rhs Value) bool {
if f.t != rhs.Type() {
return false
}
v, ok := rhs.(*function)
return ok && (f == v)
}
func (f *function) Retain() {}
func (f *function) Release() {}
func (f *function) HasSideEffect() bool {
return f.hasSideEffect
}
func (f *function) Call(ctx context.Context, args Object) (Value, error) {
return f.call(ctx, args)
}