Skip to content

Commit 8a44891

Browse files
committed
Update priority_queue.dart
Update docs. Let `removeAll` return a list. It's wasteful not to. As an implementation class, it's OK to depend on implementation.
1 parent 396140f commit 8a44891

File tree

1 file changed

+28
-22
lines changed

1 file changed

+28
-22
lines changed

pkgs/collection/lib/src/priority_queue.dart

+28-22
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,9 @@ import 'utils.dart';
2222
/// always give equal objects the same priority,
2323
/// otherwise [contains] or [remove] might not work correctly.
2424
abstract class PriorityQueue<E> {
25-
/// Creates an empty [PriorityQueue].
25+
/// Creates an empty priority queue.
2626
///
27-
/// The created [PriorityQueue] is a plain [HeapPriorityQueue].
27+
/// The created `PriorityQueue` is a plain [HeapPriorityQueue].
2828
///
2929
/// The [comparison] is a [Comparator] used to compare the priority of
3030
/// elements. An element that compares as less than another element has
@@ -36,15 +36,16 @@ abstract class PriorityQueue<E> {
3636
factory PriorityQueue([int Function(E, E)? comparison]) =
3737
HeapPriorityQueue<E>;
3838

39-
/// Create a new priority queue.
39+
/// Creates a new [HeapPriorityQueue] containing [elements].
4040
///
4141
/// The [comparison] is a [Comparator] used to compare the priority of
4242
/// elements. An element that compares as less than another element has
4343
/// a higher priority.
4444
///
45-
/// If [comparison] is omitted, it defaults to [Comparable.compare]. If this
46-
/// is the case, `E` must implement [Comparable], and this is checked at
47-
/// runtime for every comparison.
45+
/// Unlike [PriorityQueue.new], the [comparison] cannot be omitted.
46+
/// If the elements are comparable to each other, use [Comparable.compare]
47+
/// as the comparison function, or use a more specialized function
48+
/// if one is available.
4849
factory PriorityQueue.of(
4950
Iterable<E> elements, int Function(E, E) comparison) =
5051
HeapPriorityQueue<E>.of;
@@ -164,23 +165,30 @@ abstract class PriorityQueue<E> {
164165
///
165166
/// The elements are kept in a heap structure,
166167
/// where the element with the highest priority is immediately accessible,
167-
/// and modifying a single element takes
168-
/// logarithmic time in the number of elements on average.
168+
/// and modifying a single element takes, on average,
169+
/// logarithmic time in the number of elements.
169170
///
170171
/// * The [add] and [removeFirst] operations take amortized logarithmic time,
171-
/// O(log(n)), but may occasionally take linear time when growing the capacity
172-
/// of the heap.
173-
/// * The [addAll] operation works as doing repeated [add] operations.
172+
/// O(log(*N*)) where *N* is the number of elements, but may occasionally
173+
/// take linear time when growing the capacity of the heap.
174+
/// * The [addAll] operation works by doing repeated [add] operations.
175+
/// May be more efficient in some cases.
174176
/// * The [first] getter takes constant time, O(1).
175177
/// * The [clear] and [removeAll] methods also take constant time, O(1).
176178
/// * The [contains] and [remove] operations may need to search the entire
177-
/// queue for the elements, taking O(n) time.
178-
/// * The [toList] operation effectively sorts the elements, taking O(n*log(n))
179+
/// queue for the elements, taking O(*N*) time.
180+
/// * The [toList] operation effectively sorts the elements, taking O(n * log(*N*))
179181
/// time.
180182
/// * The [toUnorderedList] operation copies, but does not sort, the elements,
181183
/// and is linear, O(n).
182-
/// * The [toSet] operation effectively adds each element to the new set, taking
183-
/// an expected O(n*log(n)) time.
184+
/// * The [toSet] operation effectively adds each element to the new
185+
/// [SplayTreeSet], taking an expected O(n * log(*N*)) time.
186+
///
187+
/// The [comparison] function is used to order elements, with earlier elements
188+
/// having higher priority. That is, elements are extracted from the queue
189+
/// in ascending [comparison] order.
190+
/// If two elements have the same priority, their ordering is unspecified
191+
/// and may be arbitary.
184192
class HeapPriorityQueue<E> implements PriorityQueue<E> {
185193
/// The comparison being used to compare the priority of elements.
186194
final int Function(E, E) comparison;
@@ -316,16 +324,14 @@ class HeapPriorityQueue<E> implements PriorityQueue<E> {
316324

317325
/// Removes all the elements from this queue and returns them.
318326
///
319-
/// The returned iterable has no specified order.
320-
/// The operation does not copy the elements,
321-
/// but instead keeps them in the existing heap structure,
322-
/// and iterates over that directly.
327+
/// The [HeapPriorityQueue] returns a [List] of its elements,
328+
/// with no guaranteed order.
323329
@override
324-
Iterable<E> removeAll() {
330+
List<E> removeAll() {
325331
_modificationCount++;
326332
var result = _queue;
327333
_queue = <E>[];
328-
return result.skip(0); // Hide list nature.
334+
return result;
329335
}
330336

331337
@override
@@ -401,7 +407,7 @@ class HeapPriorityQueue<E> implements PriorityQueue<E> {
401407
} while (
402408
position > _queue.length); // Happens if last element is a left child.
403409
} while (position != 1); // At root again. Happens for right-most element.
404-
return -1;
410+
return -1;
405411
}
406412

407413
/// Place [element] in heap at [index] or above.

0 commit comments

Comments
 (0)