From 261889c5b56b6610c370e2bd6ae78c0f81e22688 Mon Sep 17 00:00:00 2001 From: Louis Pilfold Date: Wed, 14 Aug 2019 23:33:06 +0100 Subject: Slightly optimise list:sort --- gen/src/gleam@list.erl | 12 +++++++++--- gen/test/gleam@list_test.erl | 4 ++++ 2 files changed, 13 insertions(+), 3 deletions(-) (limited to 'gen') diff --git a/gen/src/gleam@list.erl b/gen/src/gleam@list.erl index 411a6c8..7781dcc 100644 --- a/gen/src/gleam@list.erl +++ b/gen/src/gleam@list.erl @@ -295,8 +295,7 @@ merge_sort(A, B, Compare) -> end end. -sort(List, Compare) -> - ListLength = length(List), +do_sort(List, Compare, ListLength) -> case ListLength < 2 of true -> List; @@ -305,9 +304,16 @@ sort(List, Compare) -> SplitLength = ListLength div 2, AList = take(List, SplitLength), BList = drop(List, SplitLength), - merge_sort(sort(AList, Compare), sort(BList, Compare), Compare) + merge_sort( + do_sort(AList, Compare, SplitLength), + do_sort(BList, Compare, ListLength - SplitLength), + Compare + ) end. +sort(List, Compare) -> + do_sort(List, Compare, length(List)). + range(Start, Stop) -> case gleam@int:compare(Start, Stop) of eq -> diff --git a/gen/test/gleam@list_test.erl b/gen/test/gleam@list_test.erl index 1037884..2411f0b 100644 --- a/gen/test/gleam@list_test.erl +++ b/gen/test/gleam@list_test.erl @@ -183,6 +183,10 @@ sort_test() -> gleam@list:sort([4, 3, 6, 5, 4], fun gleam@int:compare/2), [3, 4, 4, 5, 6] ), + gleam@expect:equal( + gleam@list:sort([4, 3, 6, 5, 4, 1], fun gleam@int:compare/2), + [1, 3, 4, 4, 5, 6] + ), gleam@expect:equal(gleam@list:sort([], fun gleam@int:compare/2), []). index_map_test() -> -- cgit v1.2.3