-
Notifications
You must be signed in to change notification settings - Fork 5
/
example_interface_test.go
56 lines (45 loc) · 1.6 KB
/
example_interface_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
// Copyright 2011 The Go Authors.
// Copyright 2015 Randall Farmer.
// All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package sorts_test
import (
"fmt"
"github.com/twotwotwo/sorts"
"github.com/twotwotwo/sorts/sortutil"
)
type City struct {
Name string
Latitude, Longitude float32
}
func (c City) String() string { return fmt.Sprintf("%s (%.1f, %.1f)", c.Name, c.Latitude, c.Longitude) }
// ByLatitude implements sort.Interface for []City based on
// the Latitude field, for sorting cities south to north.
type ByLatitude []City
func (a ByLatitude) Len() int { return len(a) }
func (a ByLatitude) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
// Float32Key and Float32Less make the sort handle the sign bit and sort NaN
// values to the end. There are also Float64Key and Float64Less, and
// [Type]Key functions for int types.
// Key returns a uint64 that is lower for more southerly latitudes.
func (a ByLatitude) Key(i int) uint64 {
return sortutil.Float32Key(a[i].Latitude)
}
func (a ByLatitude) Less(i, j int) bool {
return sortutil.Float32Less(a[i].Latitude, a[j].Latitude)
}
func Example() {
cities := []City{
{"Vancouver", 49.3, -123.1},
{"Tokyo", 35.6, 139.7},
{"Honolulu", 21.3, -157.8},
{"Sydney", -33.9, 151.2},
}
fmt.Println(cities)
sorts.ByUint64(ByLatitude(cities))
fmt.Println(cities)
// Output:
// [Vancouver (49.3, -123.1) Tokyo (35.6, 139.7) Honolulu (21.3, -157.8) Sydney (-33.9, 151.2)]
// [Sydney (-33.9, 151.2) Honolulu (21.3, -157.8) Tokyo (35.6, 139.7) Vancouver (49.3, -123.1)]
}