add generic ArrayIn function with minimal type casting (#411)

This commit is contained in:
Emmanuel Ortiz 2024-08-18 14:27:49 -06:00 committed by GitHub
parent d56c19b2aa
commit 2cd4957472
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 17 additions and 28 deletions

View file

@ -12,7 +12,7 @@ import (
"unsafe"
)
var mu = sync.Mutex{}
var mu sync.Mutex
func Read() string {
mu.Lock()

View file

@ -192,7 +192,7 @@ func (manager *SessionManager) Clear() error {
return nil
}
func (manager *SessionManager) Broadcast(v interface{}, exclude interface{}) error {
func (manager *SessionManager) Broadcast(v interface{}, exclude []string) error {
manager.mu.Lock()
defer manager.mu.Unlock()
@ -201,10 +201,8 @@ func (manager *SessionManager) Broadcast(v interface{}, exclude interface{}) err
continue
}
if exclude != nil {
if in, _ := utils.ArrayIn(id, exclude); in {
continue
}
if in, _ := utils.ArrayIn(id, exclude); in {
continue
}
if err := session.Send(v); err != nil {
@ -215,7 +213,7 @@ func (manager *SessionManager) Broadcast(v interface{}, exclude interface{}) err
return nil
}
func (manager *SessionManager) AdminBroadcast(v interface{}, exclude interface{}) error {
func (manager *SessionManager) AdminBroadcast(v interface{}, exclude []string) error {
manager.mu.Lock()
defer manager.mu.Unlock()
@ -224,10 +222,8 @@ func (manager *SessionManager) AdminBroadcast(v interface{}, exclude interface{}
continue
}
if exclude != nil {
if in, _ := utils.ArrayIn(id, exclude); in {
continue
}
if in, _ := utils.ArrayIn(id, exclude); in {
continue
}
if err := session.Send(v); err != nil {
@ -241,3 +237,5 @@ func (manager *SessionManager) AdminBroadcast(v interface{}, exclude interface{}
func (manager *SessionManager) GetEventsChannel() chan types.SessionEvent {
return manager.eventsChannel
}
var _ types.SessionManager = (*SessionManager)(nil)

View file

@ -61,7 +61,7 @@ type SessionManager interface {
Admins() []*Member
Destroy(id string)
Clear() error
Broadcast(v interface{}, exclude interface{}) error
AdminBroadcast(v interface{}, exclude interface{}) error
Broadcast(v interface{}, exclude []string) error
AdminBroadcast(v interface{}, exclude []string) error
GetEventsChannel() chan SessionEvent
}

View file

@ -1,22 +1,13 @@
package utils
import (
"reflect"
)
func ArrayIn(val interface{}, array interface{}) (exists bool, index int) {
exists = false
func ArrayIn[T comparable](val T, array []T) (exists bool, index int) {
index = -1
switch reflect.TypeOf(array).Kind() {
case reflect.Slice:
s := reflect.ValueOf(array)
for i := 0; i < s.Len(); i++ {
if reflect.DeepEqual(val, s.Index(i).Interface()) {
index = i
exists = true
return
}
for i, v := range array {
if v == val {
index = i
exists = true
return
}
}