94 lines
1.3 KiB
Go
94 lines
1.3 KiB
Go
package ptr
|
|
|
|
// scalar implementation using a value pointer
|
|
|
|
func NewScalar[V any]() Ptr[V] {
|
|
var v V
|
|
return NewVP(&v)
|
|
}
|
|
|
|
func NewVP[V any](vp *V) Ptr[V] {
|
|
get := func() V {
|
|
return *vp
|
|
}
|
|
set := func(v V) {
|
|
*vp = v
|
|
}
|
|
return NewAcc(get, set)
|
|
}
|
|
|
|
// scalar implementation using accessor functions
|
|
|
|
type acc[V any] struct {
|
|
started bool
|
|
getter func() V
|
|
setter func(v V)
|
|
}
|
|
|
|
func NewAcc[V any](g func() V, s func(v V)) *acc[V] {
|
|
return &acc[V]{
|
|
started: false,
|
|
getter: g,
|
|
setter: s,
|
|
}
|
|
}
|
|
|
|
func (p *acc[V]) Append(v V) Ptr[V] {
|
|
p.started = true
|
|
return p.Set(v)
|
|
}
|
|
|
|
func (p *acc[V]) Insert(v V, pos int) Ptr[V] {
|
|
return p.Append(v)
|
|
}
|
|
|
|
func (p *acc[V]) Next() Ptr[V] {
|
|
if p.started {
|
|
return nil
|
|
}
|
|
p.started = true
|
|
return p
|
|
}
|
|
|
|
func (p *acc[V]) Value() V {
|
|
return p.getter()
|
|
}
|
|
|
|
func (p *acc[V]) Set(v V) Ptr[V] {
|
|
p.setter(v)
|
|
return p
|
|
}
|
|
|
|
func (p *acc[V]) Size() int {
|
|
return 1
|
|
}
|
|
|
|
func (p *acc[V]) Started() bool {
|
|
return p.started
|
|
}
|
|
|
|
func (p *acc[V]) Seek(i int) Ptr[V] {
|
|
p.started = true
|
|
return p
|
|
}
|
|
|
|
func (p *acc[V]) Reset() Ptr[V] {
|
|
p.started = false
|
|
return p
|
|
}
|
|
|
|
func (p *acc[V]) Clone() Ptr[V] {
|
|
return &acc[V]{
|
|
started: p.started,
|
|
getter: p.getter,
|
|
setter: p.setter,
|
|
}
|
|
}
|
|
|
|
func (p *acc[V]) New() Ptr[V] {
|
|
return New[V](p)
|
|
}
|
|
|
|
func (p *acc[V]) Copy() Ptr[V] {
|
|
return Copy[V](p, NewScalar[V]())
|
|
}
|