123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251 |
- // Copyright (c) 2015, Emir Pasic. All rights reserved.
- // Use of this source code is governed by a BSD-style
- // license that can be found in the LICENSE file.
- package utils
- import "time"
- // Comparator will make type assertion (see IntComparator for example),
- // which will panic if a or b are not of the asserted type.
- //
- // Should return a number:
- // negative , if a < b
- // zero , if a == b
- // positive , if a > b
- type Comparator func(a, b interface{}) int
- // StringComparator provides a fast comparison on strings
- func StringComparator(a, b interface{}) int {
- s1 := a.(string)
- s2 := b.(string)
- min := len(s2)
- if len(s1) < len(s2) {
- min = len(s1)
- }
- diff := 0
- for i := 0; i < min && diff == 0; i++ {
- diff = int(s1[i]) - int(s2[i])
- }
- if diff == 0 {
- diff = len(s1) - len(s2)
- }
- if diff < 0 {
- return -1
- }
- if diff > 0 {
- return 1
- }
- return 0
- }
- // IntComparator provides a basic comparison on int
- func IntComparator(a, b interface{}) int {
- aAsserted := a.(int)
- bAsserted := b.(int)
- switch {
- case aAsserted > bAsserted:
- return 1
- case aAsserted < bAsserted:
- return -1
- default:
- return 0
- }
- }
- // Int8Comparator provides a basic comparison on int8
- func Int8Comparator(a, b interface{}) int {
- aAsserted := a.(int8)
- bAsserted := b.(int8)
- switch {
- case aAsserted > bAsserted:
- return 1
- case aAsserted < bAsserted:
- return -1
- default:
- return 0
- }
- }
- // Int16Comparator provides a basic comparison on int16
- func Int16Comparator(a, b interface{}) int {
- aAsserted := a.(int16)
- bAsserted := b.(int16)
- switch {
- case aAsserted > bAsserted:
- return 1
- case aAsserted < bAsserted:
- return -1
- default:
- return 0
- }
- }
- // Int32Comparator provides a basic comparison on int32
- func Int32Comparator(a, b interface{}) int {
- aAsserted := a.(int32)
- bAsserted := b.(int32)
- switch {
- case aAsserted > bAsserted:
- return 1
- case aAsserted < bAsserted:
- return -1
- default:
- return 0
- }
- }
- // Int64Comparator provides a basic comparison on int64
- func Int64Comparator(a, b interface{}) int {
- aAsserted := a.(int64)
- bAsserted := b.(int64)
- switch {
- case aAsserted > bAsserted:
- return 1
- case aAsserted < bAsserted:
- return -1
- default:
- return 0
- }
- }
- // UIntComparator provides a basic comparison on uint
- func UIntComparator(a, b interface{}) int {
- aAsserted := a.(uint)
- bAsserted := b.(uint)
- switch {
- case aAsserted > bAsserted:
- return 1
- case aAsserted < bAsserted:
- return -1
- default:
- return 0
- }
- }
- // UInt8Comparator provides a basic comparison on uint8
- func UInt8Comparator(a, b interface{}) int {
- aAsserted := a.(uint8)
- bAsserted := b.(uint8)
- switch {
- case aAsserted > bAsserted:
- return 1
- case aAsserted < bAsserted:
- return -1
- default:
- return 0
- }
- }
- // UInt16Comparator provides a basic comparison on uint16
- func UInt16Comparator(a, b interface{}) int {
- aAsserted := a.(uint16)
- bAsserted := b.(uint16)
- switch {
- case aAsserted > bAsserted:
- return 1
- case aAsserted < bAsserted:
- return -1
- default:
- return 0
- }
- }
- // UInt32Comparator provides a basic comparison on uint32
- func UInt32Comparator(a, b interface{}) int {
- aAsserted := a.(uint32)
- bAsserted := b.(uint32)
- switch {
- case aAsserted > bAsserted:
- return 1
- case aAsserted < bAsserted:
- return -1
- default:
- return 0
- }
- }
- // UInt64Comparator provides a basic comparison on uint64
- func UInt64Comparator(a, b interface{}) int {
- aAsserted := a.(uint64)
- bAsserted := b.(uint64)
- switch {
- case aAsserted > bAsserted:
- return 1
- case aAsserted < bAsserted:
- return -1
- default:
- return 0
- }
- }
- // Float32Comparator provides a basic comparison on float32
- func Float32Comparator(a, b interface{}) int {
- aAsserted := a.(float32)
- bAsserted := b.(float32)
- switch {
- case aAsserted > bAsserted:
- return 1
- case aAsserted < bAsserted:
- return -1
- default:
- return 0
- }
- }
- // Float64Comparator provides a basic comparison on float64
- func Float64Comparator(a, b interface{}) int {
- aAsserted := a.(float64)
- bAsserted := b.(float64)
- switch {
- case aAsserted > bAsserted:
- return 1
- case aAsserted < bAsserted:
- return -1
- default:
- return 0
- }
- }
- // ByteComparator provides a basic comparison on byte
- func ByteComparator(a, b interface{}) int {
- aAsserted := a.(byte)
- bAsserted := b.(byte)
- switch {
- case aAsserted > bAsserted:
- return 1
- case aAsserted < bAsserted:
- return -1
- default:
- return 0
- }
- }
- // RuneComparator provides a basic comparison on rune
- func RuneComparator(a, b interface{}) int {
- aAsserted := a.(rune)
- bAsserted := b.(rune)
- switch {
- case aAsserted > bAsserted:
- return 1
- case aAsserted < bAsserted:
- return -1
- default:
- return 0
- }
- }
- // TimeComparator provides a basic comparison on time.Time
- func TimeComparator(a, b interface{}) int {
- aAsserted := a.(time.Time)
- bAsserted := b.(time.Time)
- switch {
- case aAsserted.After(bAsserted):
- return 1
- case aAsserted.Before(bAsserted):
- return -1
- default:
- return 0
- }
- }
|