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 }