def merge(l, r)
  case [l, r]
  in [_, []]; l
  in [[], _]; r
  in [[x, *xs], [y, *ys]]
    return [x, *merge(xs, r)] if x <= y 
    [y, *merge(l, ys)]
  end
end 

def msort(li)
  case li  
  in []; []
  in [x]; [x]
  else     
    xs, ys = halve(li)  
    merge(msort(xs), msort(ys))  
  end
end

def halve(li)
  xs = li.take(li.length / 2)
  ys = li.drop(li.length / 2)
  [xs, ys]
end

p merge([2,4,6],[1,3,5])
p msort([3,2,4,1,5])

    

Embed on website

To embed this project on your website, copy the following code and paste it into your website's HTML: