// Copyright (C) 2025, uvok cheetah // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . extension ListExt on List { /// Similar to addOrReplaceWhere, but simply use a given keySelector do check equality. void addOrReplaceKey( T dev, { required K Function(T item) keySelector, bool Function(T existing)? replaceCondition, }) { final devKey = keySelector(dev); final idx = indexWhere((item) => keySelector(item) == devKey); if (idx == -1) { add(dev); } else { final bool shouldReplace = replaceCondition?.call(this[idx]) ?? true; if (shouldReplace) this[idx] = dev; } } /// If predicate(1) is false for all elements in the list, add the element. /// Otherwise, the first element that matches this(1) predicate might be replaced. /// For this, check replaceCondition(2). /// If (2) is omitted, the element is always replaced. /// If (2) is given, it's passed the matching element. /// The predicate(2) determines whether to replace the element. void addOrReplaceWhere( T dev, bool Function(T exDev) predicate, { bool Function(T exDev)? replaceCondition, }) { int idx = indexWhere(predicate); if (idx == -1) { add(dev); } else { final bool shouldReplace = replaceCondition?.call(this[idx]) ?? true; if (shouldReplace) this[idx] = dev; } } /// An element if the predicate is true only for all elements. /// predicate is passed all existing elements. bool addIf(T dev, bool Function(T exDev) predicate) { if (every(predicate)) { add(dev); return true; } return false; } }