#!/usr/bin/ruby

# https://rosettacode.org/wiki/Sorting_algorithms/Merge_sort

func merge(left, right) {
    gather {
        while (!left.is_empty && !right.is_empty) {
            take([right,left][left.first <= right.first].shift)
        }
    } + left + right
}

func mergesort(arr) {
    var len = arr.len
    len < 2 && return arr
    var (left, right) = arr.part(len // 2)
    merge(__FUNC__(left), __FUNC__(right))
}

# Numeric sort
var nums = @(0..7)
mergesort(nums.shuffle) == nums ||
    die "error(123)";

# String sort
var strings = @('a'..'e');
mergesort(strings.shuffle) == strings ||
    die "error(abc)";

# All OK!
say "** Test passed!";