Added filter function
This commit is contained in:
parent
c3e12a7663
commit
038b6fa31f
@ -13,6 +13,7 @@ type Collection[T any] interface {
|
|||||||
Clear()
|
Clear()
|
||||||
Delete(key string)
|
Delete(key string)
|
||||||
Exists(key string) bool
|
Exists(key string) bool
|
||||||
|
Filter(func(*T) bool) <-chan *T
|
||||||
Get(key string) (value *T, err error)
|
Get(key string) (value *T, err error)
|
||||||
Set(key string, value *T)
|
Set(key string, value *T)
|
||||||
}
|
}
|
||||||
@ -66,6 +67,25 @@ func (c *collection[T]) All() <-chan *T {
|
|||||||
return channel
|
return channel
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Filter returns a channel of all objects that pass the given filter function.
|
||||||
|
func (c *collection[T]) Filter(filter func(*T) bool) <-chan *T {
|
||||||
|
channel := make(chan *T)
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
c.data.Range(func(key, value any) bool {
|
||||||
|
if filter(value.(*T)) {
|
||||||
|
channel <- value.(*T)
|
||||||
|
}
|
||||||
|
|
||||||
|
return true
|
||||||
|
})
|
||||||
|
|
||||||
|
close(channel)
|
||||||
|
}()
|
||||||
|
|
||||||
|
return channel
|
||||||
|
}
|
||||||
|
|
||||||
// Get returns the value for the given key.
|
// Get returns the value for the given key.
|
||||||
func (c *collection[T]) Get(key string) (*T, error) {
|
func (c *collection[T]) Get(key string) (*T, error) {
|
||||||
value, exists := c.data.Load(key)
|
value, exists := c.data.Load(key)
|
||||||
|
@ -19,13 +19,35 @@ func TestAll(t *testing.T) {
|
|||||||
|
|
||||||
users.Set("1", &User{Name: "User 1"})
|
users.Set("1", &User{Name: "User 1"})
|
||||||
users.Set("2", &User{Name: "User 2"})
|
users.Set("2", &User{Name: "User 2"})
|
||||||
|
users.Set("3", &User{Name: "User 3"})
|
||||||
count := 0
|
count := 0
|
||||||
|
|
||||||
for range users.All() {
|
for range users.All() {
|
||||||
count++
|
count++
|
||||||
}
|
}
|
||||||
|
|
||||||
assert.Equal(t, count, 2)
|
assert.Equal(t, count, 3)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestFilter(t *testing.T) {
|
||||||
|
users, err := ocean.New[User]("test")
|
||||||
|
assert.Nil(t, err)
|
||||||
|
defer users.Clear()
|
||||||
|
|
||||||
|
users.Set("1", &User{Name: "User 1"})
|
||||||
|
users.Set("2", &User{Name: "User 2"})
|
||||||
|
users.Set("3", &User{Name: "User 3"})
|
||||||
|
count := 0
|
||||||
|
|
||||||
|
f := func(user *User) bool {
|
||||||
|
return user.Name == "User 2"
|
||||||
|
}
|
||||||
|
|
||||||
|
for range users.Filter(f) {
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
|
||||||
|
assert.Equal(t, count, 1)
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestGet(t *testing.T) {
|
func TestGet(t *testing.T) {
|
||||||
|
Loading…
Reference in New Issue
Block a user