diff --git a/utils/comparator.go b/utils/comparator.go new file mode 100644 index 0000000..93c1c3b --- /dev/null +++ b/utils/comparator.go @@ -0,0 +1,40 @@ +package utils + +// Comparator will make type assertion (see IntComparator for example), +// which will panic if a or b are not of the asserted type. +// +// Should return: +// -1, if a < b +// 0, if a == b +// 1, if a > b +type Comparator func(a, b interface{}) int + +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 + } +} + +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) + } + return diff +} diff --git a/utils/comparator_test.go b/utils/comparator_test.go new file mode 100644 index 0000000..63f8e27 --- /dev/null +++ b/utils/comparator_test.go @@ -0,0 +1,45 @@ +package utils + +import "testing" + +func TestIntComparator(t *testing.T) { + + tests := [][]interface{}{ + {1, 1, 0}, + {1, 2, -1}, + {2, 1, 1}, + {11, 22, -1}, + {0, 0, 0}, + {1, 0, 1}, + {0, 1, -1}, + } + + for _, test := range tests { + actual := IntComparator(test[0], test[1]) + expected := test[2] + if actual != expected { + t.Errorf("Got %v expected %v", actual, expected) + } + } +} + +func TestStringComparator(t *testing.T) { + + tests := [][]interface{}{ + {"a", "a", 0}, + {"a", "b", -1}, + {"b", "a", 1}, + {"aa", "aab", -1}, + {"", "", 0}, + {"a", "", 1}, + {"", "a", -1}, + } + + for _, test := range tests { + actual := StringComparator(test[0], test[1]) + expected := test[2] + if actual != expected { + t.Errorf("Got %v expected %v", actual, expected) + } + } +}