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" "unsafe"
) )
var mu = sync.Mutex{} var mu sync.Mutex
func Read() string { func Read() string {
mu.Lock() mu.Lock()

View file

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

View file

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

View file

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