41 lines
561 B
Go
41 lines
561 B
Go
package jobs
|
|
|
|
type Job struct {
|
|
C <-chan struct{}
|
|
rawC chan struct{}
|
|
}
|
|
|
|
func New() Job {
|
|
return newFromChannel(make(chan struct{}))
|
|
}
|
|
|
|
func (j *Job) Done() {
|
|
close(j.rawC)
|
|
}
|
|
|
|
// Combines multiple jobs into one.
|
|
func Zip(jobs ...Job) Job {
|
|
out := make(chan struct{})
|
|
go func() {
|
|
for _, job := range jobs {
|
|
<-job.C
|
|
}
|
|
close(out)
|
|
}()
|
|
return newFromChannel(out)
|
|
}
|
|
|
|
// Returns a job that is already done.
|
|
func Noop() Job {
|
|
job := New()
|
|
job.Done()
|
|
return job
|
|
}
|
|
|
|
func newFromChannel(c chan struct{}) Job {
|
|
return Job{
|
|
C: c,
|
|
rawC: c,
|
|
}
|
|
}
|