add generic ArrayIn function with minimal type casting (#411)
This commit is contained in:
parent
d56c19b2aa
commit
2cd4957472
4 changed files with 17 additions and 28 deletions
|
|
@ -12,7 +12,7 @@ import (
|
|||
"unsafe"
|
||||
)
|
||||
|
||||
var mu = sync.Mutex{}
|
||||
var mu sync.Mutex
|
||||
|
||||
func Read() string {
|
||||
mu.Lock()
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue