Compare commits
4 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
4232591fcc
|
|||
|
6d2ef61432
|
|||
|
ce8c5b516e
|
|||
|
8e203ed8d5
|
10
set.go
10
set.go
@@ -1,7 +1,9 @@
|
||||
package extypes
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Set[T any] []T
|
||||
@@ -108,3 +110,11 @@ func (s Set[T]) Map(f func(e T) T) Set[T] {
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
||||
func (s Set[T]) Join(sep string) string {
|
||||
st := make([]string, len(s))
|
||||
for i, v := range s {
|
||||
st[i] = fmt.Sprintf("%v", v)
|
||||
}
|
||||
return strings.Join(st, sep)
|
||||
}
|
||||
|
||||
19
set_test.go
Normal file
19
set_test.go
Normal file
@@ -0,0 +1,19 @@
|
||||
package extypes
|
||||
|
||||
import "testing"
|
||||
|
||||
func TestSet(t *testing.T) {
|
||||
s1 := make(Set[int], 0)
|
||||
s2 := make(Set[int], 0)
|
||||
|
||||
s1 = s1.Add(1)
|
||||
s1 = s1.Add(2)
|
||||
s1 = s1.Add(2)
|
||||
|
||||
s2 = s2.Add(1)
|
||||
s2 = s2.Add(2)
|
||||
|
||||
if !s1.Equal(s2) {
|
||||
t.Error("s1 and s2 not equal")
|
||||
}
|
||||
}
|
||||
10
slice.go
10
slice.go
@@ -1,7 +1,9 @@
|
||||
package extypes
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Slice[T any] []T
|
||||
@@ -103,3 +105,11 @@ func (s Slice[T]) Map(f func(e T) T) Slice[T] {
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
||||
func (s Slice[T]) Join(sep string) string {
|
||||
st := make([]string, len(s))
|
||||
for i, v := range s {
|
||||
st[i] = fmt.Sprintf("%v", v)
|
||||
}
|
||||
return strings.Join(st, sep)
|
||||
}
|
||||
|
||||
34
tuple.go
34
tuple.go
@@ -1,24 +1,26 @@
|
||||
package extypes
|
||||
|
||||
import "reflect"
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"reflect"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type Tuple[T any] struct {
|
||||
s Slice[T]
|
||||
}
|
||||
|
||||
func NewTupleFrom[T any](src []T) Tuple[T] {
|
||||
return Tuple[T]{src}
|
||||
}
|
||||
func (t Tuple[T]) Len() int { return t.s.Len() }
|
||||
func (t Tuple[T]) Cap() int { return t.s.Cap() }
|
||||
func (t Tuple[T]) Get(index int) T { return t.s.Get(index) }
|
||||
func NewTupleFrom[T any](src []T) Tuple[T] { return Tuple[T]{src} }
|
||||
func NewTuple[T any]() Tuple[T] { return Tuple[T]{make(Slice[T], 0)} }
|
||||
func (t Tuple[T]) Len() int { return t.s.Len() }
|
||||
func (t Tuple[T]) Cap() int { return t.s.Cap() }
|
||||
func (t Tuple[T]) Get(index int) T { return t.s.Get(index) }
|
||||
|
||||
func (t Tuple[T]) Equal(t2 Tuple[T]) bool {
|
||||
if t.Len() != t2.Len() {
|
||||
return false
|
||||
}
|
||||
if t.Cap() != t2.Cap() {
|
||||
return false
|
||||
}
|
||||
for i := range t.s {
|
||||
if !reflect.DeepEqual(t.s[i], t2.s[i]) {
|
||||
return false
|
||||
@@ -58,3 +60,15 @@ func (t Tuple[T]) ForEach(f func(int, T)) Tuple[T] {
|
||||
}
|
||||
return t
|
||||
}
|
||||
|
||||
func (t Tuple[T]) Join(sep string) string {
|
||||
st := make([]string, len(t.s))
|
||||
for i, v := range t.s {
|
||||
st[i] = fmt.Sprintf("%v", v)
|
||||
}
|
||||
return strings.Join(st, sep)
|
||||
}
|
||||
|
||||
func (t Tuple[T]) String() string { return fmt.Sprint(t.s) }
|
||||
func (t *Tuple[T]) UnmarshalJSON(data []byte) error { return json.Unmarshal(data, &t.s) }
|
||||
func (t Tuple[T]) MarshalJSON() ([]byte, error) { return json.Marshal(t.s) }
|
||||
|
||||
49
tuple_test.go
Normal file
49
tuple_test.go
Normal file
@@ -0,0 +1,49 @@
|
||||
package extypes
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestTuple(t *testing.T) {
|
||||
t1 := NewTupleFrom([]int{1, 2, 3})
|
||||
t2 := NewTupleFrom([]int{1, 2, 3})
|
||||
|
||||
if !t1.Equal(t2) {
|
||||
t.Error("t1 and t2 should be equal")
|
||||
}
|
||||
}
|
||||
func TestTuple_MarshalJSON(t *testing.T) {
|
||||
t1 := NewTupleFrom([]int{1, 2, 3})
|
||||
data, err := json.Marshal(t1)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
s := "[1,2,3]"
|
||||
if string(data) != s {
|
||||
t.Error("t1 and t2 should be equal")
|
||||
}
|
||||
}
|
||||
func TestTuple_UnmarshalJSON(t *testing.T) {
|
||||
s := "[1,2,3]"
|
||||
t1 := NewTuple[int]()
|
||||
err := json.Unmarshal([]byte(s), &t1)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t2 := NewTupleFrom([]int{1, 2, 3})
|
||||
t.Log(t1, t2)
|
||||
if !t1.Equal(t2) {
|
||||
t.Error("t1 and t2 should be equal")
|
||||
}
|
||||
|
||||
st1 := struct {
|
||||
A int `json:"a"`
|
||||
B Tuple[int] `json:"b"`
|
||||
}{}
|
||||
s2 := `{"a":1,"b":[1,2,3]}`
|
||||
if err := json.Unmarshal([]byte(s2), &st1); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Log(st1)
|
||||
}
|
||||
Reference in New Issue
Block a user