43 lines
738 B
Go
43 lines
738 B
Go
package main
|
|
|
|
import "fmt"
|
|
|
|
func sqr(number int) int {
|
|
return number * number
|
|
}
|
|
|
|
func neg(number int) int {
|
|
return -number
|
|
}
|
|
|
|
func inc(number int) int {
|
|
return number + 1
|
|
}
|
|
|
|
func pipe(value int, fn ...func(int) int) int {
|
|
for _, v := range fn {
|
|
value = v(value)
|
|
}
|
|
|
|
return value
|
|
}
|
|
|
|
func reverse(fn ...func(int) int) []func(int) int {
|
|
for idx := 0; idx < len(fn)/2; idx++ {
|
|
fn[idx], fn[len(fn)-idx-1] = fn[len(fn)-idx-1], fn[idx]
|
|
}
|
|
|
|
return fn
|
|
}
|
|
|
|
func main() {
|
|
// decorator way
|
|
decorationResult := inc(neg(sqr(5)))
|
|
fmt.Println(decorationResult)
|
|
|
|
// composition way
|
|
compositionResult1 := pipe(5, sqr, neg, inc)
|
|
compositionResult2 := pipe(5, reverse(inc, neg, sqr)...)
|
|
fmt.Println(compositionResult1, compositionResult2)
|
|
}
|