extension NullableIterableExt on Iterable? { bool get isNullOrEmpty => this == null || this!.isEmpty; } extension IterableExt on Iterable { T? reduceOrNull(T Function(T value, T element) combine) { Iterator iterator = this.iterator; if (!iterator.moveNext()) { return null; } T value = iterator.current; while (iterator.moveNext()) { value = combine(value, iterator.current); } return value; } T? firstWhereOrNull(bool Function(T element) test) { for (final element in this) { if (test(element)) return element; } return null; } } extension ListExt on List { T? getOrNull(int index) { if (index < 0 || index >= length) { return null; } return this[index]; } bool removeFirstWhere(bool Function(T) test) { final index = indexWhere(test); if (index != -1) { removeAt(index); return true; } return false; } List fromCast() { return List.from(this); } T findClosestTarget( bool Function(T) test, T Function(T, T) combine, ) { return where(test).reduceOrNull(combine) ?? reduce(combine); } }