diff --git a/27-functions-advanced/05-higher-order-funcs/main.go b/27-functions-advanced/05-higher-order-funcs/main.go index 277e483..ef5da4c 100644 --- a/27-functions-advanced/05-higher-order-funcs/main.go +++ b/27-functions-advanced/05-higher-order-funcs/main.go @@ -25,45 +25,6 @@ func main() { fmt.Printf("> 6 : %d\n", filter(greater(6), nums...)) fmt.Printf("<= 6 : %d\n", filter(lesseq(6), nums...)) fmt.Printf("<= 6 : %d\n", filter(reverse(greater(6)), nums...)) - - fmt.Println("\n••• CLOSURES •••") - fmt.Printf("uniques : %d\n", filter(uniques(), 1, 1, 2, 3, 3)) - - dups := reverse(uniques()) - fmt.Printf("dups : %v\n", filter(dups, 1, 1, 2, 3, 3)) - - dups = reverse(uniques()) - fmt.Printf("dups dups : %v\n", filter(dups, 1, 1, 2, 3, 3, 3, 3)) - - dups = reverse(uniques()) - out := filter(dups, 1, 1, 2, 3, 3, 3, 3) - fmt.Printf("dups uniqs : %v\n", filter(uniques(), out...)) - - dups = reverse(uniques()) - chained := chain(reverse(greater(1)), dups, uniques()) - fmt.Printf("dups chain : %v\n", filter(chained, 1, 1, 2, 3, 3, 3, 3, 0, 0)) -} - -func chain(filters ...filterFunc) filterFunc { - return func(n int) bool { - for _, next := range filters { - if !next(n) { - return false - } - } - return true - } -} - -func uniques() filterFunc { - seen := make(map[int]bool) - - return func(n int) (ok bool) { - if !seen[n] { - seen[n], ok = true, true - } - return - } } func reverse(f filterFunc) filterFunc { diff --git a/27-functions-advanced/06-functional-programming/main.go b/27-functions-advanced/06-functional-programming/main.go new file mode 100644 index 0000000..277e483 --- /dev/null +++ b/27-functions-advanced/06-functional-programming/main.go @@ -0,0 +1,97 @@ +// For more tutorials: https://blog.learngoprogramming.com +// +// Copyright © 2018 Inanc Gumus +// Learn Go Programming Course +// License: https://creativecommons.org/licenses/by-nc-sa/4.0/ +// + +package main + +import ( + "fmt" +) + +type filterFunc func(int) bool + +func main() { + fmt.Println("••• HIGHER-ORDER FUNCS •••") + + nums := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} + + odd := reverse(reverse(isEven)) + fmt.Printf("reversed : %t\n", odd(8)) + + fmt.Printf("> 3 : %d\n", filter(greater(3), nums...)) + fmt.Printf("> 6 : %d\n", filter(greater(6), nums...)) + fmt.Printf("<= 6 : %d\n", filter(lesseq(6), nums...)) + fmt.Printf("<= 6 : %d\n", filter(reverse(greater(6)), nums...)) + + fmt.Println("\n••• CLOSURES •••") + fmt.Printf("uniques : %d\n", filter(uniques(), 1, 1, 2, 3, 3)) + + dups := reverse(uniques()) + fmt.Printf("dups : %v\n", filter(dups, 1, 1, 2, 3, 3)) + + dups = reverse(uniques()) + fmt.Printf("dups dups : %v\n", filter(dups, 1, 1, 2, 3, 3, 3, 3)) + + dups = reverse(uniques()) + out := filter(dups, 1, 1, 2, 3, 3, 3, 3) + fmt.Printf("dups uniqs : %v\n", filter(uniques(), out...)) + + dups = reverse(uniques()) + chained := chain(reverse(greater(1)), dups, uniques()) + fmt.Printf("dups chain : %v\n", filter(chained, 1, 1, 2, 3, 3, 3, 3, 0, 0)) +} + +func chain(filters ...filterFunc) filterFunc { + return func(n int) bool { + for _, next := range filters { + if !next(n) { + return false + } + } + return true + } +} + +func uniques() filterFunc { + seen := make(map[int]bool) + + return func(n int) (ok bool) { + if !seen[n] { + seen[n], ok = true, true + } + return + } +} + +func reverse(f filterFunc) filterFunc { + return func(n int) bool { + return !f(n) + } +} + +func greater(min int) filterFunc { + return func(n int) bool { + return n > min + } +} + +func lesseq(max int) filterFunc { + return func(n int) bool { + return n <= max + } +} + +func filter(f filterFunc, nums ...int) (filtered []int) { + for _, n := range nums { + if f(n) { + filtered = append(filtered, n) + } + } + return +} + +func isEven(n int) bool { return n%2 == 0 } +func isOdd(m int) bool { return m%2 == 1 } diff --git a/27-functions-advanced/07-deferred-funcs-todo/TODO.md b/27-functions-advanced/07-deferred-funcs-todo/TODO.md new file mode 100644 index 0000000..f87f5c1 --- /dev/null +++ b/27-functions-advanced/07-deferred-funcs-todo/TODO.md @@ -0,0 +1 @@ +# TODO \ No newline at end of file diff --git a/27-functions-advanced/08-panic-recover-todo/TODO.md b/27-functions-advanced/08-panic-recover-todo/TODO.md new file mode 100644 index 0000000..f87f5c1 --- /dev/null +++ b/27-functions-advanced/08-panic-recover-todo/TODO.md @@ -0,0 +1 @@ +# TODO \ No newline at end of file