1// Copyright (c) 2015, Emir Pasic. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package main
6
7import (
8	"fmt"
9	"github.com/emirpasic/gods/maps/treemap"
10)
11
12func printMap(txt string, m *treemap.Map) {
13	fmt.Print(txt, " { ")
14	m.Each(func(key interface{}, value interface{}) {
15		fmt.Print(key, ":", value, " ")
16	})
17	fmt.Println("}")
18}
19
20// EunumerableWithKeyExample to demonstrate basic usage of EunumerableWithKey
21func main() {
22	m := treemap.NewWithStringComparator()
23	m.Put("g", 7)
24	m.Put("f", 6)
25	m.Put("e", 5)
26	m.Put("d", 4)
27	m.Put("c", 3)
28	m.Put("b", 2)
29	m.Put("a", 1)
30	printMap("Initial", m) // { a:1 b:2 c:3 d:4 e:5 f:6 g:7 }
31
32	even := m.Select(func(key interface{}, value interface{}) bool {
33		return value.(int)%2 == 0
34	})
35	printMap("Elements with even values", even) // { b:2 d:4 f:6 }
36
37	foundKey, foundValue := m.Find(func(key interface{}, value interface{}) bool {
38		return value.(int)%2 == 0 && value.(int)%3 == 0
39	})
40	if foundKey != nil {
41		fmt.Println("Element with value divisible by 2 and 3 found is", foundValue, "with key", foundKey) // value: 6, index: 4
42	}
43
44	square := m.Map(func(key interface{}, value interface{}) (interface{}, interface{}) {
45		return key.(string) + key.(string), value.(int) * value.(int)
46	})
47	printMap("Elements' values squared and letters duplicated", square) // { aa:1 bb:4 cc:9 dd:16 ee:25 ff:36 gg:49 }
48
49	bigger := m.Any(func(key interface{}, value interface{}) bool {
50		return value.(int) > 5
51	})
52	fmt.Println("Map contains element whose value is bigger than 5 is", bigger) // true
53
54	positive := m.All(func(key interface{}, value interface{}) bool {
55		return value.(int) > 0
56	})
57	fmt.Println("All map's elements have positive values is", positive) // true
58
59	evenNumbersSquared := m.Select(func(key interface{}, value interface{}) bool {
60		return value.(int)%2 == 0
61	}).Map(func(key interface{}, value interface{}) (interface{}, interface{}) {
62		return key, value.(int) * value.(int)
63	})
64	printMap("Chaining", evenNumbersSquared) // { b:4 d:16 f:36 }
65}
66