github.com/tursom/GoCollections@v0.3.10/util/Reference.go (about) 1 /* 2 * Copyright (c) 2022 tursom. All rights reserved. 3 * Use of this source code is governed by a GPL-3 4 * license that can be found in the LICENSE file. 5 */ 6 7 package util 8 9 import "github.com/tursom/GoCollections/lang" 10 11 type ( 12 Reference[R any] interface { 13 GetReference() R 14 } 15 MutableReference[R any] interface { 16 SetReference(reference R) 17 GetReference() R 18 } 19 StrongReference[R any] struct { 20 lang.BaseObject 21 reference R 22 } 23 NoReference[R any] struct { 24 lang.BaseObject 25 } 26 ) 27 28 func NewStrongReference[R any](reference R) *StrongReference[R] { 29 return &StrongReference[R]{ 30 reference: reference, 31 } 32 } 33 34 func NewNoReference[R any]() *NoReference[R] { 35 return &NoReference[R]{} 36 } 37 38 func (r *StrongReference[R]) Equals(o lang.Object) bool { 39 if r == o { 40 return true 41 } 42 if objectReference, ok := o.(Reference[R]); ok { 43 if reference, ok := any(r.reference).(lang.Equable); ok { 44 if referenceObject, ok := any(objectReference.GetReference()).(lang.Object); ok { 45 return reference.Equals(referenceObject) 46 } 47 } 48 } 49 return r == o 50 } 51 52 func (r *StrongReference[R]) SetReference(reference R) { 53 r.reference = reference 54 } 55 56 func (r *StrongReference[R]) GetReference() R { 57 return r.reference 58 } 59 60 func (r *NoReference[R]) SetReference(_ R) { 61 } 62 63 func (r *NoReference[R]) GetReference() R { 64 return lang.Nil[R]() 65 }