package ptr // scb: scalar base / common stuff type scb[V any] struct { started bool } func (p *scb[V]) Size() int { return 1 } func (p *scb[V]) Started() bool { return p.started } func (p *scb[V]) Append(v V) Ptr[V] { p.started = true return p.Set(v) } func (p *scb[V]) Insert(v V, pos int) Ptr[V] { return p.Append(v) } func (p *scb[V]) Next() Ptr[V] { if p.started { return nil } p.started = true return p } func (p *scb[V]) Value() V { var v V return v } func (p *scb[V]) Set(v V) Ptr[V] { return p } func (p *scb[V]) Seek(i int) Ptr[V] { p.started = true return p } func (p *scb[V]) Reset() Ptr[V] { p.started = false return p } func (p *scb[V]) Clone() Ptr[V] { return &scb[V]{p.started} } func (p *scb[V]) New() Ptr[V] { return New[V](p) } func (p *scb[V]) Copy() Ptr[V] { return Copy[V](p, &scb[V]{false}) } // 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 { *scb[V] getter func() V setter func(v V) } func NewAcc[V any](g func() V, s func(v V)) *acc[V] { return &acc[V]{ getter: g, setter: s, scb: &scb[V]{false}, } } 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]) Value() V { return p.getter() } func (p *acc[V]) Set(v V) Ptr[V] { p.setter(v) return p } func (p *acc[V]) Clone() Ptr[V] { return &acc[V]{ getter: p.getter, setter: p.setter, scb: &scb[V]{p.started}, } } func (p *acc[V]) New() Ptr[V] { return New[V](p) } func (p *acc[V]) Copy() Ptr[V] { return Copy[V](p, NewScalar[V]()) }