-
Notifications
You must be signed in to change notification settings - Fork 1
/
gen-strew.go
68 lines (52 loc) · 1.69 KB
/
gen-strew.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
// This file was automatically generated by genny.
// Any changes will be lost if this file is regenerated.
// see https://github.com/cheekybits/genny
// Copyright 2017 Andreas Pannewitz. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package httpsyet
import "time"
// ===========================================================================
// Beg of siteStrew - scatter them
// siteStrew returns a slice (of size = size) of channels
// one of which shall receive each inp before close.
func siteStrew(inp <-chan site, size int) (outS [](<-chan site)) {
chaS := make(map[chan site]struct{}, size)
for i := 0; i < size; i++ {
chaS[make(chan site)] = struct{}{}
}
go strewsite(inp, chaS)
outS = make([]<-chan site, size)
i := 0
for c := range chaS {
outS[i] = (<-chan site)(c) // convert `chan` to `<-chan`
i++
}
return outS
}
// c strewsite(inp <-chan site, outS ...chan<- site) {
// Note: go does not convert the passed slice `[]chan site` to `[]chan<- site` automatically.
// So, we do neither here, as we are lazy (we just call an internal helper function).
func strewsite(inp <-chan site, outS map[chan site]struct{}) {
for i := range inp {
for !trySendsite(i, outS) {
time.Sleep(time.Millisecond * 10) // wait a little before retry
} // !sent
} // inp
for o := range outS {
close(o)
}
}
func trySendsite(inp site, outS map[chan site]struct{}) bool {
for o := range outS {
select { // try to send
case o <- inp:
return true
default:
// keep trying
}
} // outS
return false
}
// End of siteStrew - scatter them
// ===========================================================================