| 118 | } |
| 119 | |
| 120 | func tee(input SimpleOutChannel, outputs []SimpleInChannel, closeWhenDone bool) { |
| 121 | cases := make([]reflect.SelectCase, len(outputs)) |
| 122 | for i := range cases { |
| 123 | cases[i].Dir = reflect.SelectSend |
| 124 | } |
| 125 | for elem := range input.Out() { |
| 126 | for i := range cases { |
| 127 | cases[i].Chan = reflect.ValueOf(outputs[i].In()) |
| 128 | cases[i].Send = reflect.ValueOf(elem) |
| 129 | } |
| 130 | for _ = range cases { |
| 131 | chosen, _, _ := reflect.Select(cases) |
| 132 | cases[chosen].Chan = reflect.ValueOf(nil) |
| 133 | } |
| 134 | } |
| 135 | if closeWhenDone { |
| 136 | for i := range outputs { |
| 137 | outputs[i].Close() |
| 138 | } |
| 139 | } |
| 140 | } |
| 141 | |
| 142 | func distribute(input SimpleOutChannel, outputs []SimpleInChannel, closeWhenDone bool) { |
| 143 | cases := make([]reflect.SelectCase, len(outputs)) |