diff --git a/function/function.go b/function/function.go index 873579e..7112f3e 100644 --- a/function/function.go +++ b/function/function.go @@ -1,7 +1,7 @@ // Copyright 2021 dudaodong@gmail.com. All rights reserved. // Use of this source code is governed by MIT license -// Package function implements some functions for functional programming. +// Package function implements some functions for control the function execution and some is for functional programming. package function @@ -47,7 +47,22 @@ func (f Fn) Curry(i interface{}) func(...interface{}) interface{} { } } -// Delay make the function excution after delayed time +// Compose compose the functions from right to left +func Compose(fnList ...func(...string) string) func(...string) string { + return func(s... string) string { + f := fnList[0] + restFn := fnList[1:] + + if len(fnList) == 1 { + return f(s...) + } + + return f(Compose(restFn...)(s...)) + } +} + + +// Delay make the function execution after delayed time func Delay(delay time.Duration, fn interface{}, args ...interface{}) { time.Sleep(delay) invokeFunc(fn, args...) diff --git a/function/function_test.go b/function/function_test.go index 93f271c..c934249 100644 --- a/function/function_test.go +++ b/function/function_test.go @@ -3,6 +3,7 @@ package function import ( "fmt" "reflect" + "strings" "testing" "time" ) @@ -69,6 +70,26 @@ func TestCurry(t *testing.T) { } } +func TestCompose(t *testing.T) { + toUpper := func(a... string) string { + return strings.ToUpper(a[0]) + } + + toLower := func(a... string) string { + return strings.ToLower(a[0]) + } + + expect := toUpper(toLower("aBCde")) + cf := Compose(toUpper, toLower) + res := cf("aBCde") + + fmt.Println(res, expect) + if res != expect { + t.FailNow() + } + +} + func TestDelay(t *testing.T) { var print = func(s string) { fmt.Println(s)