You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
72 lines
1.9 KiB
72 lines
1.9 KiB
package handlerfactory
|
|
|
|
import (
|
|
"git.aiterp.net/lucifer/new-server/models"
|
|
)
|
|
|
|
func optimizeLists(
|
|
add []models.EventHandler,
|
|
del []models.EventHandler,
|
|
) ([]models.EventHandler, []models.EventHandler) {
|
|
newAdd := make([]models.EventHandler, 0, len(add))
|
|
newDel := make([]models.EventHandler, 0, len(del))
|
|
|
|
OptimizeLoop1:
|
|
for _, addItem := range add {
|
|
for _, delItem := range del {
|
|
if checkDuplicate(&addItem, &delItem) {
|
|
continue OptimizeLoop1
|
|
}
|
|
}
|
|
|
|
newAdd = append(newAdd, addItem)
|
|
}
|
|
|
|
OptimizeLoop2:
|
|
for _, delItem := range del {
|
|
for _, addItem := range add {
|
|
if checkDuplicate(&addItem, &delItem) {
|
|
continue OptimizeLoop2
|
|
}
|
|
}
|
|
|
|
newDel = append(newDel, delItem)
|
|
}
|
|
|
|
return newAdd, newDel
|
|
}
|
|
|
|
func checkDuplicate(a *models.EventHandler, b *models.EventHandler) bool {
|
|
check := true
|
|
check = check && a.EventName == b.EventName
|
|
check = check && len(a.Conditions) == len(b.Conditions)
|
|
for k := range a.Conditions {
|
|
check = check && a.Conditions[k] == b.Conditions[k]
|
|
}
|
|
check = check && a.OneShot == b.OneShot
|
|
check = check && a.Priority == b.Priority
|
|
check = check && a.TargetKind == b.TargetKind
|
|
check = check && a.TargetValue == b.TargetValue
|
|
check = check && a.From == b.From
|
|
check = check && a.To == b.To
|
|
|
|
aPower := a.Actions.SetPower
|
|
bPower := b.Actions.SetPower
|
|
powerEq := (aPower == nil && bPower == nil) || (aPower != nil && bPower != nil && *aPower == *bPower)
|
|
|
|
aColor := a.Actions.SetColor
|
|
bColor := b.Actions.SetColor
|
|
colorEq := (aColor == nil && bColor == nil) || (aColor != nil && bColor != nil && *aColor == *bColor)
|
|
|
|
aInt := a.Actions.SetIntensity
|
|
bInt := b.Actions.SetIntensity
|
|
intEq := (aInt == nil && bInt == nil) || (aInt != nil && bInt != nil && *aInt == *bInt)
|
|
|
|
aTemp := a.Actions.SetTemperature
|
|
bTemp := b.Actions.SetTemperature
|
|
tempEq := (aTemp == nil && bTemp == nil) || (aTemp != nil && bTemp != nil && *aTemp == *bTemp)
|
|
|
|
check = check && powerEq && colorEq && intEq && tempEq
|
|
|
|
return check
|
|
}
|