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 }