39 lines
		
	
	
	
		
			803 B
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			39 lines
		
	
	
	
		
			803 B
		
	
	
	
		
			Go
		
	
	
	
	
	
| // Package ptr provides a generic interface for accessing an ordered
 | |
| // collection of values sequentially, updating it and appending to it
 | |
| // using a pointer (or cursor) type that keeps track of the current
 | |
| // position. There are also implementations based on single
 | |
| // scalar values, object attributes, or accessors.
 | |
| package ptr
 | |
| 
 | |
| type Ptr[V any] interface {
 | |
| 	Append(V) Ptr[V]
 | |
| 	Insert(V, int) Ptr[V]
 | |
| 	Next() Ptr[V]
 | |
| 	Value() V
 | |
| 	Set(V) Ptr[V]
 | |
| 	Size() int
 | |
| 	Started() bool
 | |
| 	Advance(int) Ptr[V]
 | |
| 	Seek(int) Ptr[V]
 | |
| 	Reset() Ptr[V]
 | |
| 	Clone() Ptr[V]
 | |
| 	New() Ptr[V]
 | |
| 	Copy() Ptr[V]
 | |
| }
 | |
| 
 | |
| // generic functions
 | |
| 
 | |
| func New[V any](p Ptr[V]) Ptr[V] {
 | |
| 	np := p.Clone()
 | |
| 	np.Reset()
 | |
| 	return np
 | |
| }
 | |
| 
 | |
| func Copy[V any](p, np Ptr[V]) Ptr[V] {
 | |
| 	op := p.New()
 | |
| 	for op.Next() != nil {
 | |
| 		np.Append(op.Value())
 | |
| 	}
 | |
| 	np.Reset()
 | |
| 	return np
 | |
| }
 |