summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSam Anthony <sam@samanthony.xyz>2024-08-22 21:26:41 -0400
committerSam Anthony <sam@samanthony.xyz>2024-08-22 21:26:41 -0400
commitc25a68894f3bce8a8e63289b46ecd6e29f5cc227 (patch)
tree321a856b960ba6ccc11113c8d1e93a390b9e9d90
parent67e43f976e2e07252b786e584e0290a516630df6 (diff)
downloadshare-c25a68894f3bce8a8e63289b46ecd6e29f5cc227.zip
val: add TryGet() methodv0.1.0
-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 {