// $G $D/$F.go && $L $F.$A && ./$A.out

// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package main

var c = make(chan int);

func check(a []int) {
	for i := 0; i < len(a); i++ {
		n := <-c;
		if n != a[i] {
			panicln("want", a[i], "got", n, "at", i);
		}
	}
}

func f() {
	var i, j int;

	i = 1;
	j = 2;
	f := func() {
		c <- i;
		i = 4;
		g := func() {
			c <- i;
			c <- j;
		};
		g();
		c <- i;
	};
	j = 5;
	f();
}

// Accumulator generator
func accum(n int) (func(int) int) {
	return func(i int) int {
		n += i;
		return n;
	}
}

func g(a, b func(int) int) {
	c <- a(2);
	c <- b(3);
	c <- a(4);
	c <- b(5);
}

func h() {
	var x8 byte = 100;
	var x64 int64 = 200;

	c <- int(x8);
	c <- int(x64);
	f := func(z int) {
		g := func() {
			c <- int(x8);
			c <- int(x64);
			c <- z;
		};
		g();
		c <- int(x8);
		c <- int(x64);
		c <- int(z);
	};
	x8 = 101;
	x64 = 201;
	f(500);
}

func newfunc() (func(int) int) {
	return func(x int) int { return x }
}


func main() {
	go f();
	check([]int{1,4,5,4});

	a := accum(0);
	b := accum(1);
	go g(a, b);
	check([]int{2,4,6,9});

	go h();
	check([]int{100,200,101,201,500,101,201,500});

	x, y := newfunc(), newfunc();
	if x == y {
		panicln("newfunc returned same func");
	}
	if x(1) != 1 || y(2) != 2 {
		panicln("newfunc returned broken funcs");
	}
}
