From c582001e89c0b81df1b9eb1e8f1857d1c075a805 Mon Sep 17 00:00:00 2001 From: Alexander Kiryukhin Date: Wed, 5 Dec 2018 00:48:33 +0300 Subject: Initial commit --- rutina.go | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100755 rutina.go (limited to 'rutina.go') diff --git a/rutina.go b/rutina.go new file mode 100755 index 0000000..68bf048 --- /dev/null +++ b/rutina.go @@ -0,0 +1,54 @@ +package rutina + +import ( + "context" + "sync" +) + +//Rutina is routine manager +type Rutina struct { + ctx context.Context + cancel func() + wg sync.WaitGroup + o sync.Once + err error +} + +// New instance with builtin context +func New() (*Rutina, context.Context) { + return WithContext(context.Background()) +} + +// WithContext is constructor that takes context from outside +func WithContext(ctx context.Context) (*Rutina, context.Context) { + ctx, cancel := context.WithCancel(ctx) + + return &Rutina{ctx: ctx, cancel: cancel}, ctx +} + +// Go routine +func (r *Rutina) Go(doer func(ctx context.Context) error) { + r.wg.Add(1) + go func() { + defer func() { + r.wg.Done() + if r.cancel != nil { + r.cancel() + } + }() + if err := doer(r.ctx); err != nil { + r.o.Do(func() { + r.err = err + }) + } + }() +} + +// Wait all routines and returns first error or nil if all routines completes without errors +func (r *Rutina) Wait() error { + r.wg.Wait() + if r.cancel != nil { + r.cancel() + } + return r.err +} -- cgit v1.2.3