GoCollections/util/Reference.go
2022-03-23 10:15:18 +08:00

60 lines
1.1 KiB
Go

package util
import "github.com/tursom/GoCollections/lang"
type (
Reference[R any] interface {
GetReference() R
}
MutableReference[R any] interface {
SetReference(reference R)
GetReference() R
}
StrongReference[R any] struct {
lang.BaseObject
reference R
}
NoReference[R any] struct {
lang.BaseObject
}
)
func NewStrongReference[R any](reference R) *StrongReference[R] {
return &StrongReference[R]{
reference: reference,
}
}
func NewNoReference[R any]() *NoReference[R] {
return &NoReference[R]{}
}
func (r *StrongReference[R]) Equals(o lang.Object) bool {
if r == o {
return true
}
if objectReference, ok := o.(Reference[R]); ok {
if reference, ok := any(r.reference).(lang.Equable); ok {
if referenceObject, ok := any(objectReference.GetReference()).(lang.Object); ok {
return reference.Equals(referenceObject)
}
}
}
return r == o
}
func (r *StrongReference[R]) SetReference(reference R) {
r.reference = reference
}
func (r *StrongReference[R]) GetReference() R {
return r.reference
}
func (r *NoReference[R]) SetReference(_ R) {
}
func (r *NoReference[R]) GetReference() R {
return lang.Nil[R]()
}