File: offers.go

package info (click to toggle)
golang-github-mesos-mesos-go 0.0.6%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, forky, sid, trixie
  • size: 11,724 kB
  • sloc: makefile: 163
file content (240 lines) | stat: -rw-r--r-- 5,441 bytes parent folder | download
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
package offers

import "github.com/mesos/mesos-go/api/v1/lib"

type (
	// Slice is a convenience type wrapper for a slice of mesos Offer messages
	Slice []mesos.Offer

	// Index is a convenience type wrapper for a dictionary of Offer messages
	Index map[interface{}]*mesos.Offer

	// KeyFunc generates a key used for indexing offers
	KeyFunc func(*mesos.Offer) interface{}
)

// IDs extracts the ID field from a Slice of offers
func (offers Slice) IDs() []mesos.OfferID {
	ids := make([]mesos.OfferID, len(offers))
	for i := range offers {
		ids[i] = offers[i].ID
	}
	return ids
}

// IDs extracts the ID field from a Index of offers
func (offers Index) IDs() []mesos.OfferID {
	ids := make([]mesos.OfferID, 0, len(offers))
	for _, offer := range offers {
		ids = append(ids, offer.GetID())
	}
	return ids
}

// Find returns the first Offer that passes the given filter function, or else nil if
// there are no passing offers.
func (offers Slice) Find(filter Filter) *mesos.Offer {
	for i := range offers {
		offer := &offers[i]
		if filter.Accept(offer) {
			return offer
		}
	}
	return nil
}

// Find returns the first Offer that passes the given filter function, or else nil if
// there are no passing offers.
func (offers Index) Find(filter Filter) *mesos.Offer {
	for _, offer := range offers {
		if filter.Accept(offer) {
			return offer
		}
	}
	return nil
}

// Filter returns the subset of the Slice that matches the given filter.
func (offers Slice) Filter(filter Filter) (result Slice) {
	if sz := len(result); sz > 0 {
		result = make(Slice, 0, sz)
		for i := range offers {
			if filter.Accept(&offers[i]) {
				result = append(result, offers[i])
			}
		}
	}
	return
}

// Filter returns the subset of the Index that matches the given filter.
func (offers Index) Filter(filter Filter) (result Index) {
	if sz := len(result); sz > 0 {
		result = make(Index, sz)
		for id, offer := range offers {
			if filter.Accept(offer) {
				result[id] = offer
			}
		}
	}
	return
}

// FilterNot returns the subset of the Slice that does not match the given filter.
func (offers Slice) FilterNot(filter Filter) Slice { return offers.Filter(not(filter)) }

// FilterNot returns the subset of the Index that does not match the given filter.
func (offers Index) FilterNot(filter Filter) Index { return offers.Filter(not(filter)) }

// DefaultKeyFunc indexes offers by their OfferID.
var DefaultKeyFunc = KeyFunc(KeyFuncByOfferID)

func KeyFuncByOfferID(o *mesos.Offer) interface{} { return o.GetID() }

// NewIndex returns a new Index constructed from the list of mesos offers.
// If the KeyFunc is nil then offers are indexed by DefaultKeyFunc.
// The values of the returned Index are pointers to (not copies of) the offers of the slice receiver.
func NewIndex(slice []mesos.Offer, kf KeyFunc) Index {
	if slice == nil {
		return nil
	}
	if kf == nil {
		kf = DefaultKeyFunc
	}
	index := make(Index, len(slice))
	for i := range slice {
		offer := &slice[i]
		index[kf(offer)] = offer
	}
	return index
}

// ToSlice returns a Slice from the offers in the Index.
// The returned slice will contain shallow copies of the offers from the Index.
func (offers Index) ToSlice() (slice Slice) {
	if sz := len(offers); sz > 0 {
		slice = make(Slice, 0, sz)
		for _, offer := range offers {
			slice = append(slice, *offer)
		}
	}
	return
}

/*

type Reducer func(_, _ *Offer) *Offer

func (slice Slice) Reduce(r Reducer) (result Offer) {
	if r == nil {
		return
	}
	acc := &result
	for i := range slice {
		acc = r(&result, &slice[i])
	}
	if acc == nil {
		result = Offer{}
	} else {
		result = *acc
	}
	return
}

func (index Index) Reduce(r Reducer) (result *Offer) {
	if r == nil {
		return
	}
	for i := range index {
		result = r(result, index[i])
	}
	return
}

func (slice Slice) GroupBy(kf KeyFunc) map[interface{}]Slice {
	if kf == nil {
		panic("keyFunc must not be nil")
	}
	if len(slice) == 0 {
		return nil
	}
	result := make(map[interface{}]Slice)
	for i := range slice {
		groupKey := kf(&slice[i])
		result[groupKey] = append(result[groupKey], slice[i])
	}
	return result
}

func (index Index) GroupBy(kf KeyFunc) map[interface{}]Index {
	if kf == nil {
		panic("keyFunc must not be nil")
	}
	if len(index) == 0 {
		return nil
	}
	result := make(map[interface{}]Index)
	for i, offer := range index {
		groupKey := kf(offer)
		group, ok := result[groupKey]
		if !ok {
			group = make(Index)
			result[groupKey] = group
		}
		group[i] = offer
	}
	return result
}

func (index Index) Partition(f Filter) (accepted, rejected Index) {
	if f == nil {
		return index, nil
	}
	if len(index) > 0 {
		accepted, rejected = make(Index), make(Index)
		for id, offer := range index {
			if f.Accept(offer) {
				accepted[id] = offer
			} else {
				rejected[id] = offer
			}
		}
	}
	return
}

func (s Slice) Partition(f Filter) (accepted, rejected []int) {
	if f == nil {
		accepted = make([]int, len(s))
		for i := range s {
			accepted[i] = i
		}
		return
	}
	if sz := len(s); sz > 0 {
		accepted, rejected = make([]int, 0, sz/2), make([]int, 0, sz/2)
		for i := range s {
			offer := &s[i]
			if f.Accept(offer) {
				accepted = append(accepted, i)
			} else {
				rejected = append(rejected, i)
			}
		}
	}
	return
}

func (index Index) Reindex(kf KeyFunc) Index {
	sz := len(index)
	if kf == nil || sz == 0 {
		return index
	}
	result := make(Index, sz)
	for _, offer := range index {
		key := kf(offer)
		result[key] = offer
	}
	return result
}
*/