-
Notifications
You must be signed in to change notification settings - Fork 0
/
map.go
131 lines (122 loc) · 3.12 KB
/
map.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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package fragments
import (
"github.com/shousper/go-funcy/model"
. "github.com/dave/jennifer/jen"
)
// MapOf produces a map type for the given types
//
// type MapOfT map[K]T
//
func MapOf(f *File, m model.Model) {
f.Commentf("%s is a string map of %s", m.Map.Name, m.Type)
f.Type().Id(m.Map.Name).
Map(m.Map.Key.Type.AsCode()).Add(m.TypeCode())
}
// MapOfKeys produces a slice of the keys of the map
//
// func (m MapOfT) Keys() (keys []K) {
// for key := range m {
// keys = append(keys, key)
// }
// return
// }
//
func MapOfKeys(f *File, m model.Model) {
f.Comment("Keys returns a slice of the map keys")
f.Func().
Params(Id("m").Id(m.Map.Name)).
Id("Keys").
Params().
Params(Id("keys").Index().Add(m.Map.Key.Type.AsCode())).
Block(
For(Id("key").Op(":=").Range().Id("m")).Block(
Id("keys").Op("=").Append(Id("keys"), Id("key")),
),
Return(),
)
}
// MapOfValues produces a slice of the values of the map
//
// func (m MapOfT) Values() (values []*T) {
// for _, value := range m {
// values = append(values, value)
// }
// return
// }
//
func MapOfValues(f *File, m model.Model) {
f.Comment("Values returns a slice of the map values")
f.Func().
Params(Id("m").Id(m.Map.Name)).
Id("Values").
Params().
Params(Id("values").Index().Add(m.TypeCode())).
Block(
For(List(Id("_"), Id("value")).Op(":=").Range().Id("m")).Block(
Id("values").Op("=").Append(Id("values"), Id("value")),
),
Return(),
)
}
// MapOfSelect produces a map with only the specified keys form the map
//
// func (m MapOfT) Select(keys ...K) MapOfT {
// result := make(MapOfT)
// for _, key := range keys {
// if value, exists := m[key]; exists {
// result[key] = value
// }
// }
// return result
// }
//
func MapOfSelect(f *File, m model.Model) {
f.Comment("Select returns a map with only the given keys")
f.Func().
Params(Id("m").Id(m.Map.Name)).
Id("Select").
Params(Id("keys").Op("...").Add(m.Map.Key.Type.AsCode())).
Id(m.Map.Name).
Block(
Id("result").Op(":=").Make(Id(m.Map.Name)),
For(List(Id("_"), Id("key")).Op(":=").Range().Id("keys")).Block(
If(
List(Id("value"), Id("exists")).Op(":=").Id("m").Index(Id("key")),
Id("exists"),
).Block(
Id("result").Index(Id("key")).Op("=").Id("value"),
),
),
Return(Id("result")),
)
}
// MapOfGroupBys produces maps regrouped by a field value
//
// func (m MapOfT) GroupByF() map[J][]T {
// result := make(map[J][]T)
// for _, value := range m {
// result[value.F] = append(result[value.F], value)
// }
// return result
// }
//
func MapOfGroupBys(f *File, m model.Model) {
for _, g := range m.GroupBys {
fnName := "GroupBy" + g.Name
outType := Map(g.Type.AsCode()).Index().Add(m.TypeCode())
mappedField := Id("result").Index(Id("value").Dot(g.Accessor))
f.Commentf("%s groups map values by %s", fnName, g.Name)
f.Func().
Params(Id("m").Id(m.Map.Name)).
Id(fnName).
Params().
Add(outType).
Block(
Id("result").Op(":=").Make(outType),
For(List(Id("_"), Id("value")).Op(":=").Range().Id("m")).Block(
Add(mappedField).Op("=").Append(mappedField, Id("value")),
),
Return(Id("result")),
)
}
}