From af20de2bcda8cfe28ea4075fb9fb1586ae9f70e5 Mon Sep 17 00:00:00 2001 From: smee Date: Sun, 20 Feb 2022 18:10:25 +0300 Subject: [PATCH] go generics --- README.md | 14 ++--- go.mod | 3 +- swap.go | 152 ++------------------------------------------------- swap_test.go | 42 +++++--------- 4 files changed, 28 insertions(+), 183 deletions(-) diff --git a/README.md b/README.md index a47376f..bb84194 100644 --- a/README.md +++ b/README.md @@ -17,17 +17,17 @@ func init() { import "github.com/tada-team/swap" func TestWithSwap(t *testing.T) { - defer swap.Bool(&myConfig.Foo, "test value")() - defer swap.Int(&myConfig.Bar, 42)() + defer swap.Value(&myConfig.Foo, "test value")() + defer swap.Value(&myConfig.Bar, 42)() // ...test cases... } // more sugar func TestWithSwapChain(t *testing.T) { - defer swap.Chain( - swap.Bool(&myConfig.Foo, "test value"), - swap.Int(&myConfig.Bar, 42), - )() - // ...test cases... + defer swap.Chain( + swap.Value(&myConfig.Foo, "test value"), + swap.Value(&myConfig.Bar, 42), + )() + // ...test cases... } ``` diff --git a/go.mod b/go.mod index c359dd8..1cbecf3 100644 --- a/go.mod +++ b/go.mod @@ -1,4 +1,3 @@ module github.com/tada-team/swap -go 1.13 - +go 1.18 diff --git a/swap.go b/swap.go index 92dd99f..e472ee7 100644 --- a/swap.go +++ b/swap.go @@ -1,9 +1,6 @@ package swap -import ( - "sync" - "time" -) +import "sync" var mux sync.RWMutex @@ -23,11 +20,11 @@ func RevChain(fns ...func()) func() { } } -func True(p *bool) func() { return Bool(p, true) } +func True(p *bool) func() { return Value(p, true) } -func False(p *bool) func() { return Bool(p, false) } +func False(p *bool) func() { return Value(p, false) } -func Bool(p *bool, v bool) func() { +func Value[T any](p *T, v T) func() { mux.Lock() defer mux.Unlock() @@ -41,146 +38,7 @@ func Bool(p *bool, v bool) func() { } } -func GetBool(p *bool) bool { - mux.RLock() - defer mux.RUnlock() - return *p -} - -func String(p *string, v string) func() { - mux.Lock() - defer mux.Unlock() - - old := *p - *p = v - - return func() { - mux.Lock() - defer mux.Unlock() - *p = old - } -} - -func GetString(p *string) string { - mux.RLock() - defer mux.RUnlock() - return *p -} - -func Strings(p *[]string, v []string) func() { - mux.Lock() - defer mux.Unlock() - - old := *p - *p = v - - return func() { - mux.Lock() - defer mux.Unlock() - *p = old - } -} - -func GetStrings(p *[]string) []string { - mux.RLock() - defer mux.RUnlock() - return *p -} - -func Int(p *int, v int) func() { - mux.Lock() - defer mux.Unlock() - - old := *p - *p = v - - return func() { - mux.Lock() - defer mux.Unlock() - *p = old - } -} - -func GetInt(p *int) int { - mux.RLock() - defer mux.RUnlock() - return *p -} - -func Int64(p *int64, v int64) func() { - mux.Lock() - defer mux.Unlock() - - old := *p - *p = v - - return func() { - mux.Lock() - defer mux.Unlock() - *p = old - } -} - -func GetInt64(p *int64) int64 { - mux.RLock() - defer mux.RUnlock() - return *p -} - -func Int32(p *int32, v int32) func() { - mux.Lock() - defer mux.Unlock() - - old := *p - *p = v - - return func() { - mux.Lock() - defer mux.Unlock() - *p = old - } -} - -func GetInt32(p *int32) int32 { - mux.RLock() - defer mux.RUnlock() - return *p -} - -func Duration(p *time.Duration, v time.Duration) func() { - mux.Lock() - defer mux.Unlock() - - old := *p - *p = v - - return func() { - mux.Lock() - defer mux.Unlock() - *p = old - } -} - -func GetDuration(p *time.Duration) time.Duration { - mux.RLock() - defer mux.RUnlock() - return *p -} - -func Time(p *time.Time, v time.Time) func() { - mux.Lock() - defer mux.Unlock() - - old := *p - *p = v - return func() { - mux.Lock() - defer mux.Unlock() - *p = old - } -} - -func GetTime(p *time.Time) time.Time { +func GetValue[T any](p *T) T { mux.RLock() defer mux.RUnlock() return *p diff --git a/swap_test.go b/swap_test.go index d218d03..6677490 100644 --- a/swap_test.go +++ b/swap_test.go @@ -2,40 +2,28 @@ package swap import "testing" -func TestChain(t *testing.T) { - x := 2 - y := 3 +func TestValueAndChain(t *testing.T) { + someInt := 2 + someString := "3" + someStrings := []string{"3"} + someBool := true t.Run("defer", func(t *testing.T) { - if x != 2 { - t.Fatal("x must be 2") + if someInt != 2 { + t.Fatal("someInt must be 2") } defer Chain( - Int(&x, 10), - Int(&y, 20), + Value(&someInt, 10), + Value(&someString, "20"), + Value(&someBool, false), + Value(&someStrings, []string{"fff"}), )() - if x != 10 { - t.Fatal("x must be 10") + if someInt != 10 { + t.Fatal("someInt must be 10") } }) - if x != 2 { - t.Fatal("x must be 2") - } -} - -func TestInt(t *testing.T) { - x := 2 - t.Run("defer", func(t *testing.T) { - if x != 2 { - t.Fatal("x must be 2") - } - defer Int(&x, 10)() - if x != 10 { - t.Fatal("x must be 10") - } - }) - if x != 2 { - t.Fatal("x must be 2") + if someInt != 2 { + t.Fatal("someInt must be 2") } }