forked from samsarahq/thunder
-
Notifications
You must be signed in to change notification settings - Fork 0
/
await.go
54 lines (44 loc) · 837 Bytes
/
await.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
package graphql
import "fmt"
func await(value interface{}) (interface{}, error) {
switch value := value.(type) {
case *thunk:
return value.await()
case map[string]interface{}:
for k, v := range value {
v, err := await(v)
if err != nil {
return nil, nestPathError(k, err)
}
value[k] = v
}
case []interface{}:
for i, v := range value {
v, err := await(v)
if err != nil {
return nil, nestPathError(fmt.Sprint(i), err)
}
value[i] = v
}
}
return value, nil
}
type thunk struct {
value interface{}
err error
done chan struct{}
}
func fork(f func() (interface{}, error)) *thunk {
t := &thunk{
done: make(chan struct{}, 0),
}
go func() {
t.value, t.err = f()
close(t.done)
}()
return t
}
func (t *thunk) await() (interface{}, error) {
<-t.done
return t.value, t.err
}