Skip to content
Snippets Groups Projects
Select Git revision
  • 2950ec194656f78a314b02adf62670cbc8168cb5
  • master default protected
  • 1.31
  • 4.38.8
  • 4.38.7
  • 4.38.6
  • 4.38.5
  • 4.38.4
  • 4.38.3
  • 4.38.2
  • 4.38.1
  • 4.38.0
  • 4.37.2
  • 4.37.1
  • 4.37.0
  • 4.36.0
  • 4.35.0
  • 4.34.1
  • 4.34.0
  • 4.33.1
  • 4.33.0
  • 4.32.2
  • 4.32.1
23 results

target-init-platform-part.mk

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)
    }