diff --git a/immut/priority_queue/moon.pkg.json b/immut/priority_queue/moon.pkg.json index eb3ebb4cb..bf9d227ee 100644 --- a/immut/priority_queue/moon.pkg.json +++ b/immut/priority_queue/moon.pkg.json @@ -5,6 +5,7 @@ "moonbitlang/core/immut/list", "moonbitlang/core/quickcheck" ], + "test-import": ["moonbitlang/core/random"], "targets": { "panic_test.mbt": ["not", "native"] } diff --git a/immut/priority_queue/priority_queue.mbt b/immut/priority_queue/priority_queue.mbt index f3eab608f..694837ee7 100644 --- a/immut/priority_queue/priority_queue.mbt +++ b/immut/priority_queue/priority_queue.mbt @@ -104,7 +104,8 @@ fn meld[A : Compare](l : Cont[A], r : Cont[A]) -> Cont[A] { fn merges[A : Compare](x : @list.T[Cont[A]]) -> Cont[A] { loop x, Empty { Nil, acc => acc - Cons(t, rest), acc => continue rest, meld(t, acc) + Cons(t, Nil), acc => meld(t, acc) + Cons(t1, Cons(t2, rest)), acc => continue rest, meld(meld(t1, t2), acc) } } diff --git a/immut/priority_queue/priority_queue_test.mbt b/immut/priority_queue/priority_queue_test.mbt index 4b3a16bc0..1d77e254c 100644 --- a/immut/priority_queue/priority_queue_test.mbt +++ b/immut/priority_queue/priority_queue_test.mbt @@ -163,3 +163,25 @@ test "equal" { let pq5 = @priority_queue.of([1, 2, 3]) inspect!(pq1 == pq5, content="false") } + +///| +test "complex" { + fn rand(upper : Int) -> Int { + let rng = @random.new() + rng.int(limit=upper) + } + + let arr = (0).until(1000, inclusive=true).collect() + arr.shuffle_in_place(rand~) + let mut pq = new() + for i in 0..=1000 { + pq = pq.push(arr[i]) + } + assert_eq!(pq.length(), 1001) + for i in 0..=1000 { + assert_eq!(pq.peek(), Some(1000 - i)) + pq = pq.pop().unwrap() + } + inspect!(pq.iter(), content="[]") + assert_eq!(pq.length(), 0) +}