Quicksort
The examples are available here: codeberg.org/laserpants/coal-examples
Tree.coal
module Tree(Tree, insert, from_list, flatten) { import List(reduce) type Tree<a> = Leaf | Node(a, Tree<a>, Tree<a>) fun insert(n : a, tree : Tree<a>) : Tree<a> with (Ordered<a>) = fold(tree) { | Leaf => Node(n, Leaf, Leaf) | Node(v, @left as left_tree, @right as right_tree) when (n < v) => Node(v, left, right_tree) when (n > v) => Node(v, left_tree, right) otherwise => Node(v, left_tree, right_tree) } fun from_list(xs : List<a>) : Tree<a> with (Ordered<a>) = reduce(insert, Leaf, xs) fun flatten(tree : Tree<a>) : List<a> = fold(tree, []) { | Leaf => fn(acc) => acc | Node(v, @left, @right) => fn(acc) => left(v :: right(acc)) } }module Tree(Tree, insert, from_list, flatten) { import List(reduce) type Tree<a> = Leaf | Node(a, Tree<a>, Tree<a>) fun insert(n : a, tree : Tree<a>) : Tree<a> with (Ordered<a>) = fold(tree) { | Leaf => Node(n, Leaf, Leaf) | Node(v, @left as left_tree, @right as right_tree) when (n < v) => Node(v, left, right_tree) when (n > v) => Node(v, left_tree, right) otherwise => Node(v, left_tree, right_tree) } fun from_list(xs : List<a>) : Tree<a> with (Ordered<a>) = reduce(insert, Leaf, xs) fun flatten(tree : Tree<a>) : List<a> = fold(tree, []) { | Leaf => fn(acc) => acc | Node(v, @left, @right) => fn(acc) => left(v :: right(acc)) } }
Qsort.coal
module Qsort(sort) { import Tree(flatten, from_list) let sort : List<a> -> List<a> with (Ordered<a>) = flatten << from_list }module Qsort(sort) { import Tree(flatten, from_list) let sort : List<a> -> List<a> with (Ordered<a>) = flatten << from_list }
Main.coal
module Main { import Qsort(sort) import IO(return) import Coal.Monad(and_eval) import namespace IO fun print_all(ints : List<int32>) : IO<unit> = fold(ints) { | [] => return() | m :: @next => IO.println_int32(m) |. and_eval(next) } fun main() = let sorted = sort([ 4, 34, 8, 99, 5, 102, 42, 7, 2, 1, 103, 3, 6 ]) in print_all(sorted) }module Main { import Qsort(sort) import IO(return) import Coal.Monad(and_eval) import namespace IO fun print_all(ints : List<int32>) : IO<unit> = fold(ints) { | [] => return() | m :: @next => IO.println_int32(m) |. and_eval(next) } fun main() = let sorted = sort([ 4, 34, 8, 99, 5, 102, 42, 7, 2, 1, 103, 3, 6 ]) in print_all(sorted) }