summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--val.go13
-rw-r--r--val_test.go24
2 files changed, 37 insertions, 0 deletions
diff --git a/val.go b/val.go
index 4d35fb9..2b762cb 100644
--- a/val.go
+++ b/val.go
@@ -47,6 +47,19 @@ func (v Val[T]) Get() T {
return <-c
}
+// TryGet returns the stored value if it has already been set, or false if it hasn't.
+func (v Val[T]) TryGet() (*T, bool) {
+ c := make(chan T)
+ defer close(c)
+ select {
+ case v.Request <- c:
+ val := <-c
+ return &val, true
+ default:
+ return nil, false
+ }
+}
+
func (v Val[T]) Close() {
close(v.Request)
close(v.Set)
diff --git a/val_test.go b/val_test.go
index 188f8a8..c1b7766 100644
--- a/val_test.go
+++ b/val_test.go
@@ -34,6 +34,30 @@ func TestValSetRemote(t *testing.T) {
<-done
}
+// Val.TryGet() before Set should fail.
+func TestValTryGetFail(t *testing.T) {
+ sv := share.NewVal[int]() // type is arbitrary
+ defer sv.Close()
+ if v, ok := sv.TryGet(); ok {
+ t.Errorf("Val.TryGet() succeeded (returned %v) before value was set; expected to fail", v)
+ }
+}
+
+// Val.TryGet() after Set should succeed.
+func TestValTryGet(t *testing.T) {
+ sv := share.NewVal[string]()
+ defer sv.Close()
+ v := "foo"
+ sv.Set <- v
+ ret, ok := sv.TryGet()
+ if !ok {
+ t.Error("Val.TryGet() failed")
+ }
+ if *ret != v {
+ t.Errorf("Val.TryGet() returned %v; expected %v", ret, v)
+ }
+}
+
func verifySameVal[T comparable](sv share.Val[T], v T, t *testing.T) {
ret := sv.Get()
if ret != v {