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 }