egison-3.2.4: lib/core/order.egi
;;;;;
;;;;;
;;;;; Order Library
;;;;;
;;;;;
(define $ordering
(algebraic-data-matcher
{<less> <equal> <greater>}))
(define $split-by-ordering
(lambda [$compare]
(lambda [$xs $p]
(match xs (list something)
{[<nil> [{} {} {}]]
[<cons $x $rs>
(let {[[$ys1 $ys2 $ys3] ((split-by-ordering compare) rs p)]}
(match (compare x p) ordering
{[<less> [{x @ys1} ys2 ys3]]
[<equal> [ys1 {x @ys2} ys3]]
[<greater> [ys1 ys2 {x @ys3}]]}))]}))))
(define $qsort
(lambda [$compare]
(match-lambda (list something)
{[<nil> {}]
[<cons $x <nil>> {x}]
[$xs (let {[$n (length xs)]}
(let {[$p (nth (quotient n 2) xs)]}
(let {[[$ys1 $ys2 $ys3] ((split-by-ordering compare) xs p)]}
{@((qsort compare) ys1) @ys2 @((qsort compare) ys3)})))]})))