summaryrefslogtreecommitdiff
path: root/go/sum-of-multiples/sum_of_multiples.go
blob: c99cdd789ab2f5ec6e3e97f830a460ed1e222552 (plain)
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
package summultiples

import "sync"

func MultipleSummer(n ...int) func(top int) int {
	return func(top int) int {
		c := make(chan int)
		wg := sync.WaitGroup{}
		// spawn worker
		for _, v := range n {
			wg.Add(1)
			go func(m int) {
				for i := m; i < top; i += m {
					c <- i
				}
				wg.Done()
			}(v)
		}
		go func() {
			wg.Wait()
			close(c)
		}()
		// collect, uniq and sum up values
		var sum int
		seen := make(map[int]bool)
		for v := range c {
			if !seen[v] {
				seen[v] = true
				sum += v
			}
		}
		return sum
	}
}