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  }