Skip to content
Snippets Groups Projects
Select Git revision
  • 5172c0e4f0a4c70d3052d31ed7f5398e719b0365
  • master default protected
  • v1.23.2
  • v1.23.1
  • v1.23.0
  • v1.22.0
  • v1.21.1
  • v1.21.0
  • v1.20.3
  • v1.20.2
  • v1.20.1
  • v1.20.0
  • v1.19.4
  • v1.19.3
  • v1.19.2
  • v1.19.1
  • v1.19.0
  • v1.18.2
  • v1.18.1
  • v1.18.0
  • v1.17.0
  • v1.16.1
22 results

queue_test.go

Blame
  • promise.go 1.25 KiB
    package jobqueue
    
    import (
    	"sync"
    )
    
    type Promise[T any] struct {
    	isDone  bool
    	value   T
    	err     error
    	mux     sync.Mutex
    	done    chan struct{}
    	resolve func(T)
    	reject  func(error)
    }
    
    func NewPromise[T any](fn func(resolve func(T), reject func(error))) *Promise[T] {
    	p := &Promise[T]{
    		done: make(chan struct{}),
    	}
    	p.resolve = func(value T) {
    		p.mux.Lock()
    		defer p.mux.Unlock()
    		if p.isDone {
    			return
    		}
    		p.isDone = true
    		p.value = value
    		close(p.done)
    	}
    	p.reject = func(err error) {
    		p.mux.Lock()
    		defer p.mux.Unlock()
    		if p.isDone {
    			return
    		}
    		p.isDone = true
    		p.err = err
    		close(p.done)
    	}
    	go fn(p.resolve, p.reject)
    	return p
    }
    func Then[T, U any](p *Promise[T], onFulfilled func(T) (U, error), onRejected func(error) error) *Promise[U] {
    
    	return NewPromise[U](func(resolve func(U), reject func(error)) {
    
    		<-p.done
    
    		p.mux.Lock()
    		defer p.mux.Unlock()
    		if p.err != nil {
    			err := onRejected(p.err)
    			reject(err)
    		} else {
    			go func() {
    				res, err := onFulfilled(p.value)
    				if err != nil {
    					reject(err)
    				} else {
    					resolve(res)
    				}
    			}()
    		}
    	})
    }
    
    func Catch[T any](p *Promise[T], onRejected func(error) error) *Promise[T] {
    	return Then[T, T](p, func(value T) (T, error) {
    		return value, nil
    	}, onRejected)
    }