83 lines
1.9 KiB
Go
83 lines
1.9 KiB
Go
package changelist
|
|
|
|
// memChangeList implements a simple in memory change list.
|
|
type memChangelist struct {
|
|
changes []Change
|
|
}
|
|
|
|
// NewMemChangelist instantiates a new in-memory changelist
|
|
func NewMemChangelist() Changelist {
|
|
return &memChangelist{}
|
|
}
|
|
|
|
// List returns a list of Changes
|
|
func (cl memChangelist) List() []Change {
|
|
return cl.changes
|
|
}
|
|
|
|
// Add adds a change to the in-memory change list
|
|
func (cl *memChangelist) Add(c Change) error {
|
|
cl.changes = append(cl.changes, c)
|
|
return nil
|
|
}
|
|
|
|
// Location returns the string "memory"
|
|
func (cl memChangelist) Location() string {
|
|
return "memory"
|
|
}
|
|
|
|
// Remove deletes the changes found at the given indices
|
|
func (cl *memChangelist) Remove(idxs []int) error {
|
|
remove := make(map[int]struct{})
|
|
for _, i := range idxs {
|
|
remove[i] = struct{}{}
|
|
}
|
|
var keep []Change
|
|
|
|
for i, c := range cl.changes {
|
|
if _, ok := remove[i]; ok {
|
|
continue
|
|
}
|
|
keep = append(keep, c)
|
|
}
|
|
cl.changes = keep
|
|
return nil
|
|
}
|
|
|
|
// Clear empties the changelist file.
|
|
func (cl *memChangelist) Clear(archive string) error {
|
|
// appending to a nil list initializes it.
|
|
cl.changes = nil
|
|
return nil
|
|
}
|
|
|
|
// Close is a no-op in this in-memory change-list
|
|
func (cl *memChangelist) Close() error {
|
|
return nil
|
|
}
|
|
|
|
func (cl *memChangelist) NewIterator() (ChangeIterator, error) {
|
|
return &MemChangeListIterator{index: 0, collection: cl.changes}, nil
|
|
}
|
|
|
|
// MemChangeListIterator is a concrete instance of ChangeIterator
|
|
type MemChangeListIterator struct {
|
|
index int
|
|
collection []Change // Same type as memChangeList.changes
|
|
}
|
|
|
|
// Next returns the next Change
|
|
func (m *MemChangeListIterator) Next() (item Change, err error) {
|
|
if m.index >= len(m.collection) {
|
|
return nil, IteratorBoundsError(m.index)
|
|
}
|
|
item = m.collection[m.index]
|
|
m.index++
|
|
return item, err
|
|
}
|
|
|
|
// HasNext indicates whether the iterator is exhausted
|
|
func (m *MemChangeListIterator) HasNext() bool {
|
|
return m.index < len(m.collection)
|
|
}
|