Skip to content

Commit

Permalink
Add start and end flags.
Browse files Browse the repository at this point in the history
  • Loading branch information
asakatida committed Oct 28, 2018
1 parent 706e9d9 commit 9504c36
Showing 1 changed file with 27 additions and 13 deletions.
40 changes: 27 additions & 13 deletions primes.go
Original file line number Diff line number Diff line change
@@ -1,32 +1,35 @@
package main

import "log"
import (
"flag"
"log"
)

func runCounter(counter chan<- int, prime int) {
func runCounter(counter chan<- uint, prime uint) {
for count := prime * 2; ; count += prime {
counter <- count
}
}

func newCounter(prime int) <-chan int {
counter := make(chan int)
func newCounter(prime uint) <-chan uint {
counter := make(chan uint)
go runCounter(counter, prime)
return counter
}

func stepCounter(h map[int]<-chan int, counter <-chan int) {
func stepCounter(h map[uint]<-chan uint, counter <-chan uint) {
c := <-counter
if h[c], counter = counter, h[c]; counter != nil {
go stepCounter(h, counter)
}
}

func insertPrime(primes chan<- int, h map[int]<-chan int, gC int) {
func insertPrime(primes chan<- uint, h map[uint]<-chan uint, gC uint) {
primes <- gC
stepCounter(h, newCounter(gC))
}

func primeStep(primes chan<- int, h map[int]<-chan int, gC int) {
func primeStep(primes chan<- uint, h map[uint]<-chan uint, gC uint) {
counter := h[gC]
if counter == nil {
insertPrime(primes, h, gC)
Expand All @@ -36,23 +39,34 @@ func primeStep(primes chan<- int, h map[int]<-chan int, gC int) {
}
}

func primeLoop(primes chan<- int) {
func primeLoop(primes chan<- uint) {
primes <- 2
h := make(map[int]<-chan int)
h := make(map[uint]<-chan uint)
for gC := 3; ; gC += 2 {
primeStep(primes, h, gC)
primeStep(primes, h, uint(gC))
}
}

func makePrimes() <-chan int {
primes := make(chan int)
func makePrimes() <-chan uint {
primes := make(chan uint)
go primeLoop(primes)
return primes
}

func main() {
var start uint
var end uint
flag.UintVar(&start, "start", 0, "usage")
flag.UintVar(&end, "end", 10, "usage")
flag.Parse()
primes := makePrimes()
for {
log.Println(<-primes)
prime := <-primes
if prime > end {
return
}
if prime >= start {
log.Println(prime)
}
}
}

0 comments on commit 9504c36

Please sign in to comment.