diff --git a/README.md b/README.md index e1bdca6..a833b13 100644 --- a/README.md +++ b/README.md @@ -739,14 +739,38 @@ Comparator signature: type Comparator func(a, b interface{}) int ``` -Two common comparators are included in the library: +All common comparators for builtin types are included in the library: ```go +func StringComparator(a, b interface{}) int + func IntComparator(a, b interface{}) int -``` -```go -func StringComparator(a, b interface{}) int +func Int8Comparator(a, b interface{}) int + +func Int16Comparator(a, b interface{}) int + +func Int32Comparator(a, b interface{}) int + +func Int64Comparator(a, b interface{}) int + +func UIntComparator(a, b interface{}) int + +func UInt8Comparator(a, b interface{}) int + +func UInt16Comparator(a, b interface{}) int + +func UInt32Comparator(a, b interface{}) int + +func UInt64Comparator(a, b interface{}) int + +func Float32Comparator(a, b interface{}) int + +func Float64Comparator(a, b interface{}) int + +func ByteComparator(a, b interface{}) int + +func RuneComparator(a, b interface{}) int ``` Writing custom comparators is easy: diff --git a/utils/comparator.go b/utils/comparator.go index 9efab79..98d6e3d 100644 --- a/utils/comparator.go +++ b/utils/comparator.go @@ -13,20 +13,6 @@ package utils // positive , if a > b type Comparator func(a, b interface{}) int -// IntComparator provides a basic comparison on ints -func IntComparator(a, b interface{}) int { - aInt := a.(int) - bInt := b.(int) - switch { - case aInt > bInt: - return 1 - case aInt < bInt: - return -1 - default: - return 0 - } -} - // StringComparator provides a fast comparison on strings func StringComparator(a, b interface{}) int { s1 := a.(string) @@ -50,3 +36,199 @@ func StringComparator(a, b interface{}) int { } 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 + } +}