diff options
| author | Maxime Dénès | 2020-06-24 18:20:13 +0200 |
|---|---|---|
| committer | Hugo Herbelin | 2020-08-20 21:27:15 +0200 |
| commit | 68a18c80332bace9064e202d13f01c880cc114ec (patch) | |
| tree | 64e86a4cc061d5e5823c23ec80e7e1e44786d519 /dev/bench/sort-by-deps | |
| parent | c75f4dcdd3b61b3950ae89f2618a3d7302a64772 (diff) | |
Special commit to start benchmarking.
Diffstat (limited to 'dev/bench/sort-by-deps')
| -rw-r--r-- | dev/bench/sort-by-deps | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/dev/bench/sort-by-deps b/dev/bench/sort-by-deps new file mode 100644 index 0000000000..e1da4e0ed5 --- /dev/null +++ b/dev/bench/sort-by-deps @@ -0,0 +1,33 @@ +#!/usr/bin/env ocaml + +let get_pkg_name arg = + List.nth (String.split_on_char ':' arg) 0 + +let get_pkg_deps arg = + String.split_on_char ',' (List.nth (String.split_on_char ':' arg) 1) + +let split_pkg arg = get_pkg_name arg, get_pkg_deps arg + +let depends_on arg1 arg2 = + let pkg1, deps1 = split_pkg arg1 in + let pkg2, deps2 = split_pkg arg2 in + pkg1 != pkg2 && List.mem pkg2 deps1 + +let rec sort = function + | [], [] -> [] + | [], deferred -> sort (List.rev deferred, []) + | arg :: rest, deferred -> + (* check if any remaining package reverse-depends on this one *) + if List.exists (fun other_arg -> depends_on arg other_arg) rest + then (* defer this package *) + sort (rest, arg :: deferred) + else (* emit this package, and then try again with any deferred packages *) + arg :: sort (List.rev deferred @ rest, []) + +let main () = + let args = Array.to_list Sys.argv in + let pkgs = List.tl args in + let sorted_pkgs = sort (pkgs, []) in + Printf.printf "%s\n%!" (String.concat " " (List.map get_pkg_name sorted_pkgs)) + +let () = main () |
