github.com/linchen2chris/hugo@v0.0.0-20230307053224-cec209389705/compare/compare.go (about)

     1  // Copyright 2019 The Hugo Authors. All rights reserved.
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  // http://www.apache.org/licenses/LICENSE-2.0
     7  //
     8  // Unless required by applicable law or agreed to in writing, software
     9  // distributed under the License is distributed on an "AS IS" BASIS,
    10  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    11  // See the License for the specific language governing permissions and
    12  // limitations under the License.
    13  
    14  package compare
    15  
    16  // Eqer can be used to determine if this value is equal to the other.
    17  // The semantics of equals is that the two value are interchangeable
    18  // in the Hugo templates.
    19  type Eqer interface {
    20  	// Eq returns whether this value is equal to the other.
    21  	// This is for internal use.
    22  	Eq(other any) bool
    23  }
    24  
    25  // ProbablyEqer is an equal check that may return false positives, but never
    26  // a false negative.
    27  type ProbablyEqer interface {
    28  	// For internal use.
    29  	ProbablyEq(other any) bool
    30  }
    31  
    32  // Comparer can be used to compare two values.
    33  // This will be used when using the le, ge etc. operators in the templates.
    34  // Compare returns -1 if the given version is less than, 0 if equal and 1 if greater than
    35  // the running version.
    36  type Comparer interface {
    37  	Compare(other any) int
    38  }
    39  
    40  // Eq returns whether v1 is equal to v2.
    41  // It will use the Eqer interface if implemented, which
    42  // defines equals when two value are interchangeable
    43  // in the Hugo templates.
    44  func Eq(v1, v2 any) bool {
    45  	if v1 == nil || v2 == nil {
    46  		return v1 == v2
    47  	}
    48  
    49  	if eqer, ok := v1.(Eqer); ok {
    50  		return eqer.Eq(v2)
    51  	}
    52  
    53  	return v1 == v2
    54  }