Skip to content

Commit c49a060

Browse files
authored
Distinguish sort and sortInPlace. (#405)
* Distinguish sort and sortInPlace. * Fix.
1 parent e47c123 commit c49a060

File tree

4 files changed

+40
-7
lines changed

4 files changed

+40
-7
lines changed

Changelog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
* Add `PriorityQueue` (#392).
66
* Add support for Weak references (#388).
77
* Clarify difference between `List` and `pure/List` in doc comments (#386).
8+
* **Breaking:** Rename `sort` to `sortInPlace`, add `sort` (#405).
89

910
## 1.0.0
1011

src/List.mo

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -587,15 +587,15 @@ module {
587587
/// List.add(list, 3);
588588
/// List.add(list, 1);
589589
/// List.add(list, 2);
590-
/// List.sort(list, Nat.compare);
590+
/// List.sortInPlace(list, Nat.compare);
591591
/// assert List.toArray(list) == [1, 2, 3];
592592
/// ```
593593
///
594594
/// Runtime: O(size * log(size))
595595
///
596596
/// Space: O(size)
597597
/// *Runtime and space assumes that `compare` runs in O(1) time and space.
598-
public func sort<T>(list : List<T>, compare : (T, T) -> Order.Order) {
598+
public func sortInPlace<T>(list : List<T>, compare : (T, T) -> Order.Order) {
599599
if (size(list) < 2) return;
600600
let arr = toVarArray(list);
601601
VarArray.sortInPlace(arr, compare);
@@ -604,6 +604,31 @@ module {
604604
}
605605
};
606606

607+
/// Sorts the elements in the list according to `compare`.
608+
/// Sort is deterministic, stable, and in-place.
609+
///
610+
/// Example:
611+
/// ```motoko include=import
612+
/// import Nat "mo:core/Nat";
613+
///
614+
/// let list = List.empty<Nat>();
615+
/// List.add(list, 3);
616+
/// List.add(list, 1);
617+
/// List.add(list, 2);
618+
/// let sorted = List.sort(list, Nat.compare);
619+
/// assert List.toArray(sorted) == [1, 2, 3];
620+
/// ```
621+
///
622+
/// Runtime: O(size * log(size))
623+
///
624+
/// Space: O(size)
625+
/// *Runtime and space assumes that `compare` runs in O(1) time and space.
626+
public func sort<T>(list : List<T>, compare : (T, T) -> Types.Order) : List<T> {
627+
let array = toVarArray(list);
628+
VarArray.sortInPlace(array, compare);
629+
fromVarArray(array)
630+
};
631+
607632
/// Finds the first index of `element` in `list` using equality of elements defined
608633
/// by `equal`. Returns `null` if `element` is not found.
609634
///

test/List.test.mo

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -811,7 +811,7 @@ run(
811811
[
812812
test(
813813
"sort",
814-
List.sort<Nat>(list, Nat.compare) |> List.toArray(list),
814+
List.sortInPlace<Nat>(list, Nat.compare) |> List.toArray(list),
815815
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] |> M.equals(T.array(T.natTestable, _))
816816
)
817817
]
@@ -1134,9 +1134,15 @@ func testReverse(n : Nat) : Bool {
11341134
};
11351135

11361136
func testSort(n : Nat) : Bool {
1137-
let vec = List.fromArray<Int>(Array.tabulate<Int>(n, func(i) = (i * 123) % 100 - 50));
1138-
List.sort(vec, Int.compare);
1139-
List.equal(vec, List.fromArray<Int>(Array.sort(Array.tabulate<Int>(n, func(i) = (i * 123) % 100 - 50), Int.compare)), Int.equal)
1137+
let array = Array.tabulate<Int>(n, func(i) = (i * 123) % 100 - 50);
1138+
let vec = List.fromArray<Int>(array);
1139+
1140+
let sorted = List.sort(vec, Int.compare);
1141+
List.sortInPlace(vec, Int.compare);
1142+
1143+
let expected = List.fromArray<Int>(Array.sort(array, Int.compare));
1144+
1145+
List.equal(vec, expected, Int.equal) and List.equal(sorted, expected, Int.equal)
11401146
};
11411147

11421148
func testToArray(n : Nat) : Bool {

validation/api/api.lock.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -559,7 +559,8 @@
559559
"public func reverseValues<T>(list : List<T>) : Iter.Iter<T>",
560560
"public func singleton<T>(element : T) : List<T>",
561561
"public func size<T>(list : List<T>) : Nat",
562-
"public func sort<T>(list : List<T>, compare : (T, T) -> Order.Order)",
562+
"public func sort<T>(list : List<T>, compare : (T, T) -> Types.Order) : List<T>",
563+
"public func sortInPlace<T>(list : List<T>, compare : (T, T) -> Order.Order)",
563564
"public func toArray<T>(list : List<T>) : [T]",
564565
"public func toPure<T>(list : List<T>) : PureList.List<T>",
565566
"public func toText<T>(list : List<T>, f : T -> Text) : Text",

0 commit comments

Comments
 (0)