From 95e2899e8abfb4f2fcc59fbe4f59a57522f996bd Mon Sep 17 00:00:00 2001 From: starainrt Date: Wed, 1 Sep 2021 11:03:02 +0800 Subject: [PATCH] add wait timeout function --- fn.go | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 fn.go diff --git a/fn.go b/fn.go new file mode 100644 index 0000000..9d7e309 --- /dev/null +++ b/fn.go @@ -0,0 +1,55 @@ +package stario + +import ( + "errors" + "time" +) + +var ERR_TIMEOUT = errors.New("TIME OUT") + +func StopUntilTimeout(tm time.Duration, fn func(chan struct{}) error) error { + var err error + finished := make(chan struct{}) + imout := make(chan struct{}) + go func() { + err = fn(imout) + finished <- struct{}{} + }() + select { + case <-finished: + return err + case <-time.After(tm): + close(imout) + return ERR_TIMEOUT + } +} + +func StopUntilFinished(fn func() error) <-chan error { + finished := make(chan error) + go func() { + err := fn() + finished <- err + }() + return finished +} + +func StopUntilTimeoutFinished(tm time.Duration, fn func(chan struct{}) error) <-chan error { + var err error + finished := make(chan struct{}) + result := make(chan error) + imout := make(chan struct{}) + go func() { + err = fn(imout) + finished <- struct{}{} + }() + go func() { + select { + case <-finished: + result <- err + case <-time.After(tm): + close(imout) + result <- ERR_TIMEOUT + } + }() + return result +}