From d56228b768d2bd3136d0b065ed759fd1495bd1d3 Mon Sep 17 00:00:00 2001 From: Changeden Date: Thu, 13 Jan 2022 10:40:02 +0800 Subject: [PATCH] Add Tools Module and add Ternary Operator Apis. --- tools/go.mod | 5 ++ tools/go.sum | 11 ++++ tools/ternary_operator.go | 97 ++++++++++++++++++++++++++++++++++ tools/ternary_operator_test.go | 86 ++++++++++++++++++++++++++++++ 4 files changed, 199 insertions(+) create mode 100644 tools/go.mod create mode 100644 tools/go.sum create mode 100644 tools/ternary_operator.go create mode 100644 tools/ternary_operator_test.go diff --git a/tools/go.mod b/tools/go.mod new file mode 100644 index 0000000..b133400 --- /dev/null +++ b/tools/go.mod @@ -0,0 +1,5 @@ +module github.com/guangzhou-meta/go-lib/tools + +go 1.16 + +require github.com/stretchr/testify v1.7.0 diff --git a/tools/go.sum b/tools/go.sum new file mode 100644 index 0000000..acb88a4 --- /dev/null +++ b/tools/go.sum @@ -0,0 +1,11 @@ +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/tools/ternary_operator.go b/tools/ternary_operator.go new file mode 100644 index 0000000..cddd50d --- /dev/null +++ b/tools/ternary_operator.go @@ -0,0 +1,97 @@ +package tools + +func TernaryOperator(condition bool, trueResult interface{}, falseResult interface{}) interface{} { + if condition { + return trueResult + } + return falseResult +} + +func TernaryOperatorInt(condition bool, trueResult int, falseResult int) int { + return TernaryOperator(condition, trueResult, falseResult).(int) +} + +func TernaryOperatorInt8(condition bool, trueResult int8, falseResult int8) int8 { + return TernaryOperator(condition, trueResult, falseResult).(int8) +} + +func TernaryOperatorInt16(condition bool, trueResult int16, falseResult int16) int16 { + return TernaryOperator(condition, trueResult, falseResult).(int16) +} + +func TernaryOperatorInt32(condition bool, trueResult int32, falseResult int32) int32 { + return TernaryOperator(condition, trueResult, falseResult).(int32) +} + +func TernaryOperatorInt64(condition bool, trueResult int64, falseResult int64) int64 { + return TernaryOperator(condition, trueResult, falseResult).(int64) +} + +func TernaryOperatorUInt(condition bool, trueResult uint, falseResult uint) uint { + return TernaryOperator(condition, trueResult, falseResult).(uint) +} + +func TernaryOperatorUInt8(condition bool, trueResult uint8, falseResult uint8) uint8 { + return TernaryOperator(condition, trueResult, falseResult).(uint8) +} + +func TernaryOperatorUInt16(condition bool, trueResult uint16, falseResult uint16) uint16 { + return TernaryOperator(condition, trueResult, falseResult).(uint16) +} + +func TernaryOperatorUInt32(condition bool, trueResult uint32, falseResult uint32) uint32 { + return TernaryOperator(condition, trueResult, falseResult).(uint32) +} + +func TernaryOperatorUInt64(condition bool, trueResult uint64, falseResult uint64) uint64 { + return TernaryOperator(condition, trueResult, falseResult).(uint64) +} + +func TernaryOperatorFloat32(condition bool, trueResult float32, falseResult float32) float32 { + return TernaryOperator(condition, trueResult, falseResult).(float32) +} + +func TernaryOperatorFloat64(condition bool, trueResult float64, falseResult float64) float64 { + return TernaryOperator(condition, trueResult, falseResult).(float64) +} + +func TernaryOperatorString(condition bool, trueResult string, falseResult string) string { + return TernaryOperator(condition, trueResult, falseResult).(string) +} + +type TernaryOperatorNestWrap struct { + condition TernaryOperatorNestConditionFunc + trueResult interface{} + falseResult interface{} +} + +type TernaryOperatorNestConditionFunc func() bool + +func TernaryOperatorNest(condition TernaryOperatorNestConditionFunc, trueResult interface{}, falseResult interface{}) *TernaryOperatorNestWrap { + return &TernaryOperatorNestWrap{ + condition: condition, + trueResult: trueResult, + falseResult: falseResult, + } +} + +func resolveTernaryOperatorNestResult(result interface{}) interface{} { + if r, ok := result.(*TernaryOperatorNestWrap); ok { + return r.Result() + } + return result +} + +func (t *TernaryOperatorNestWrap) Result() interface{} { + if t.condition == nil { + return nil + } + return TernaryOperator( + t.condition(), + func() interface{} { + return resolveTernaryOperatorNestResult(t.trueResult) + }, + func() interface{} { + return resolveTernaryOperatorNestResult(t.falseResult) + }).(func() interface{})() +} diff --git a/tools/ternary_operator_test.go b/tools/ternary_operator_test.go new file mode 100644 index 0000000..61d68d1 --- /dev/null +++ b/tools/ternary_operator_test.go @@ -0,0 +1,86 @@ +package tools + +import ( + "math/rand" + "testing" + "time" +) + +import ( + "github.com/stretchr/testify/assert" +) + +func randomCondition() bool { + t := time.Now().UnixNano() / 1e6 + return t%2 == 1 +} + +func TestTernaryOperator(t *testing.T) { + condition := randomCondition() + trueResult := "true" + falseResult := "false" + var actual string + if condition { + actual = trueResult + } else { + actual = falseResult + } + result := TernaryOperator(condition, trueResult, falseResult) + assert.Equal(t, actual, result) +} + +func getNestRandomCondition(f int64, n int32) bool { + rand.Seed(time.Now().UnixNano() / f) + randomNum := time.Duration(rand.Int31n(n)) + time.Sleep(randomNum * time.Millisecond) + return randomCondition() +} + +func TestTernaryOperatorNest(t *testing.T) { + var condition0 bool + var condition1 bool + var condition2 bool + + trueResult0 := "true" + falseResult0 := "false" + + trueResult1 := 48 + falseResult1 := 3.14 + + result := TernaryOperatorNest( + func() bool { + condition0 = getNestRandomCondition(1e6, 2) + return condition0 + }, + trueResult0, + TernaryOperatorNest( + func() bool { + condition1 = getNestRandomCondition(1e7, 4) + return condition1 + }, + trueResult1, + TernaryOperatorNest( + func() bool { + condition2 = getNestRandomCondition(1e6, 6) + return condition2 + }, + falseResult0, + falseResult1, + ), + ), + ).Result() + + if condition0 { + assert.Equal(t, trueResult0, result) + return + } + if condition1 { + assert.Equal(t, trueResult1, result) + return + } + if condition2 { + assert.Equal(t, falseResult0, result) + return + } + assert.Equal(t, falseResult1, result) +}