-
Notifications
You must be signed in to change notification settings - Fork 1
/
future.go
76 lines (58 loc) · 1.08 KB
/
future.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
// Copyright (c) 2021 James Bowes. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package future
import (
"context"
"fmt"
"time"
)
type result[T, K any] struct {
t T
k K
}
type Future[T, K any] struct {
c <-chan *result[T, K]
r *result[T, K]
}
func New[T, K any](fn func() (T, K)) *Future[T, K] {
c := make(chan *result[T, K])
fut := &Future[T, K]{c: c}
go func() {
r := result[T, K]{}
r.t, r.k = fn()
c <- &r
}()
return fut
}
func (f *Future[T, K]) Await() (T, K) {
if f.r == nil {
f.r = <-f.c
}
return f.r.t, f.r.k
}
type result3[T, K, L any] struct {
t T
k K
l L
}
type Future3[T, K, L any] struct {
c <-chan *result3[T, K, L]
r *result3[T, K, L]
}
func New3[T, K, L any](fn func() (T, K, L)) *Future3[T, K, L] {
c := make(chan *result3[T, K, L])
fut := &Future3[T, K, L]{c: c}
go func() {
r := result3[T, K, L]{}
r.t, r.k, r.l = fn()
c <- &r
}()
return fut
}
func (f *Future3[T, K]) Await() (T, K, L) {
if f.r == nil {
f.r = <-f.c
}
return f.r.t, f.r.k, f.r.l
}