/* Copyright (C) 2011-2023  Patrick H. E. Foubet - E2L Ivry
Ecole du Logiciel Libre : https://e2li.org/

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or any
later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>
*******************************************************************/

package main

import (
	"fmt"
)

func main() {
	adder := func(a int, b int) int {
		return a + b
	}

	fmt.Println(adder(5, 6))

	counter1 := counter()
	counter2 := counter()

	fmt.Println(counter1())
	fmt.Println(counter2())

	deferredPrint()
}

func counter() func() int {
	i := 0
	return func() int {
		i++
		return i
	}
}

func deferredPrint() {
	defer fmt.Println("defer 1")
	fmt.Println("regular thing")
	defer fmt.Println("defer 2")
}
