package core

import "sync"

// A wrapper around sync.Map for *Job.
type JobMap struct {
	wrapped sync.Map
}

func (m *JobMap) Store(key JobId, value *Job) {
	m.wrapped.Store(key, value)
}

func (m *JobMap) Load(key JobId) (value *Job, ok bool) {
	if value, ok := m.wrapped.Load(key); !ok {
		return nil, false
	} else {
		return value.(*Job), true
	}
}

func (m *JobMap) LoadOrStore(key JobId, value *Job) (actual *Job, loaded bool) {
	if iactual, iloaded := m.wrapped.LoadOrStore(key, value); iactual != nil {
		return iactual.(*Job), iloaded
	} else {
		return nil, iloaded
	}
}

func (m *JobMap) Range(f func(key JobId, value *Job) bool) {
	m.wrapped.Range(func(ikey, ivalue interface{}) bool {
		return f(ikey.(JobId), ivalue.(*Job))
	})
}