1
1
mirror of https://github.com/anoma/juvix.git synced 2024-12-03 09:41:10 +03:00
juvix/tests/Compilation/positive/test032.juvix
2024-07-02 10:03:06 +02:00

58 lines
1.4 KiB
Plaintext

-- merge sort
module test032;
import Stdlib.Prelude open;
split : {A : Type} → Nat → List A → Pair (List A) (List A)
| zero xs := nil, xs
| (suc n) nil := nil, nil
| (suc n) (x :: xs) :=
case split n xs of l1, l2 := x :: l1, l2;
terminating
merge' : List Nat → List Nat → List Nat
| nil ys := ys
| xs nil := xs
| xs@(x :: xs') ys@(y :: ys') :=
ite (x <= y) (x :: merge' xs' ys) (y :: merge' xs ys');
terminating
sort : List Nat → List Nat
| xs :=
let
n : Nat := length xs;
in if
| n <= 1 := xs
| else :=
case split (div n 2) xs of
l1, l2 := merge' (sort l1) (sort l2);
terminating
uniq : List Nat → List Nat
| nil := nil
| (x :: nil) := x :: nil
| (x :: xs@(x' :: _)) :=
ite (x == x') (uniq xs) (x :: uniq xs);
gen : List Nat → Nat → (Nat → Nat) → List Nat
| acc zero f := acc
| acc (suc n) f := gen (f (suc n) :: acc) n f;
gen2 : List (List Nat) → Nat → Nat → List (List Nat)
| acc m zero := acc
| acc m (suc n) :=
gen2 (gen nil m ((+) (suc n)) :: acc) m n;
printListNatLn : List Nat → IO
| nil := printStringLn "nil"
| (x :: xs) :=
printNat x >>> printString " :: " >>> printListNatLn xs;
main : IO :=
printListNatLn
(take 10 (uniq (sort (flatten (gen2 nil 6 40)))))
>>> printListNatLn
(take 10 (uniq (sort (flatten (gen2 nil 9 80)))))
>>> printListNatLn
(take 10 (uniq (sort (flatten (gen2 nil 6 80)))));