github.com/ngicks/gokugen@v0.0.5/task_storage/taskmap.go (about)

     1  package taskstorage
     2  
     3  import (
     4  	"sync"
     5  
     6  	"github.com/ngicks/gokugen"
     7  )
     8  
     9  type TaskMap struct {
    10  	m *sync.Map
    11  }
    12  
    13  func NewTaskMap() *TaskMap {
    14  	return &TaskMap{
    15  		m: new(sync.Map),
    16  	}
    17  }
    18  
    19  func (m *TaskMap) LoadOrStore(k string, v gokugen.Task) (actual gokugen.Task, loaded bool) {
    20  	act, loaded := m.m.LoadOrStore(k, v)
    21  	actual = act.(gokugen.Task)
    22  	return
    23  }
    24  
    25  func (m *TaskMap) Has(k string) (has bool) {
    26  	_, has = m.m.Load(k)
    27  	return
    28  }
    29  
    30  func (m *TaskMap) Clone() *TaskMap {
    31  	cloned := make(map[string]gokugen.Task)
    32  	m.m.Range(func(key, value any) bool {
    33  		cloned[key.(string)] = value.(gokugen.Task)
    34  		return true
    35  	})
    36  
    37  	synMap := new(sync.Map)
    38  	for k, v := range cloned {
    39  		synMap.Store(k, v)
    40  	}
    41  	return &TaskMap{
    42  		m: synMap,
    43  	}
    44  }
    45  
    46  func (m *TaskMap) LoadAndDelete(k string) (task gokugen.Task, loaded bool) {
    47  	v, loaded := m.m.LoadAndDelete(k)
    48  	if !loaded {
    49  		return
    50  	}
    51  	task = v.(gokugen.Task)
    52  	return
    53  }
    54  
    55  func (m *TaskMap) Delete(k string) (deleted bool) {
    56  	_, deleted = m.m.LoadAndDelete(k)
    57  	return
    58  }
    59  
    60  func (m *TaskMap) AllIds() []string {
    61  	ids := make([]string, 0)
    62  	m.m.Range(func(key, value any) bool {
    63  		ids = append(ids, key.(string))
    64  		return true
    65  	})
    66  	return ids
    67  }