// ==========================================================================
// $Id: selectchannel.go,v 1.1 2015/04/03 21:51:31 jlang Exp $
// CSI2120 GO: Concurrency
// ==========================================================================
// (C)opyright:
//
//   Jochen Lang
//   EECS, University of Ottawa
//   800 King Edward Ave.
//   Ottawa, On., K1N 6N5
//   Canada.
//   http://www.eecs.uottawa.ca
//
// Creator: Jochen Lang
// Email:   jlang@eecs.uottawa.ca
// ==========================================================================
// $Log: selectchannel.go,v $
// Revision 1.1  2015/04/03 21:51:31  jlang
// Added some more detailed examples on go channels
//
// ==========================================================================
package main

import (
	"fmt"
	"time"
	"runtime"
)

func main() {
	runtime.GOMAXPROCS(3)
	cities := []string{"Ottawa", "Toronto", "Gatineau", "Casselman"}
	countries := []string{"Canada","US","Mexico","China","Australia"}
	ch1 := sendString(cities, 150 )
	ch2 := sendString(countries, 200 )
	outOfHere := time.NewTimer(time.Millisecond * 350)
Forever:
	for {
		select {
		case str, ok := <- ch1:
			if !ok {
				break Forever
			}
			fmt.Printf("%s \n", str )
		case str, ok := <- ch2:
			if !ok {
				break Forever
			}
			fmt.Printf("%s \n", str )
		case <-outOfHere.C:
			fmt.Printf("Time is up\n" )
			break Forever
		}
	}
}

func sendString(strArr []string, d int ) chan string {
	ch := make(chan string)
	go func( d int ) { // start a lambda in a go routine
		for _,s := range strArr {
			ch <- s
			time.Sleep(time.Duration(d)*time.Millisecond)
		}
		close(ch)
	}(d)
	return ch
}
