enum List<T> {
Cons(T, Box<List<T>>),
Nil,
}
impl<T: Copy + PartialOrd> List<T> {
fn nil() -> Self {List::Nil}
fn prepend(self, x: T) -> Self {
List::Cons(x, Box::new(self))
}
fn each<F>(&self, f: F) where F: Fn(&T) {
self.fold(|(), x| f(x), ());
}
fn fold<F, U>(&self, f: F, acc: U) -> U where F: Fn(U, &T) -> U {
match self {
List::Nil => acc,
List::Cons(x, xs) => {
let acc = f(acc, x);
xs.fold(f, acc)
}
}
}
fn rev(&self) -> Self {
self.fold(|acc, &x| acc.prepend(x), List::<T>::nil())
}
fn concat(&self, other: &Self) -> Self {
self.rev().fold(|acc, &x| acc.prepend(x), other.rev().fold(|acc, &x| acc.prepend(x), List::<T>::nil()))
}
fn partition<F>(&self, f: F) -> (Self, Self) where F: Fn(&T) -> bool {
self.rev().fold(
|(ts, fs), x| if f(x) {(ts.prepend(*x), fs)} else {(ts, fs.prepend(*x))},
(List::<T>::nil(), List::<T>::nil())
)
}
fn
qsort(&self
) -> Self
{ match self {
List::Nil => List::Nil,
List::Cons(pivot, tail) => {
let (smaller, rest) = tail.partition(|x| *x < *pivot);
smaller.
qsort().
concat(&rest.
qsort().
prepend(*pivot
)) }
}
}
}
fn main() {
let list = List::<i32>::nil().prepend(4).prepend(8).prepend(8).prepend(3).rev();
list.each(|n| print!("{}", n));println!("");
list.
qsort().
each(|n
| print
!("{}", n
));println
!("");}
ZW51bSBMaXN0PFQ+IHsKCUNvbnMoVCwgQm94PExpc3Q8VD4+KSwKCU5pbCwKfQppbXBsPFQ6IENvcHkgKyBQYXJ0aWFsT3JkPiBMaXN0PFQ+IHsKCWZuIG5pbCgpIC0+IFNlbGYge0xpc3Q6Ok5pbH0KCWZuIHByZXBlbmQoc2VsZiwgeDogVCkgLT4gU2VsZiB7CgkJTGlzdDo6Q29ucyh4LCBCb3g6Om5ldyhzZWxmKSkKCX0KCWZuIGVhY2g8Rj4oJnNlbGYsIGY6IEYpIHdoZXJlIEY6IEZuKCZUKSB7CgkJc2VsZi5mb2xkKHwoKSwgeHwgZih4KSwgKCkpOwoJfQoJZm4gZm9sZDxGLCBVPigmc2VsZiwgZjogRiwgYWNjOiBVKSAtPiBVIHdoZXJlIEY6IEZuKFUsICZUKSAtPiBVIHsKCQltYXRjaCBzZWxmIHsKCQkJTGlzdDo6TmlsID0+IGFjYywKCQkJTGlzdDo6Q29ucyh4LCB4cykgPT4gewoJCQkJbGV0IGFjYyA9IGYoYWNjLCB4KTsKCQkJCXhzLmZvbGQoZiwgYWNjKQoJCQl9CgkJfQoJfQoJZm4gcmV2KCZzZWxmKSAtPiBTZWxmIHsKCQlzZWxmLmZvbGQofGFjYywgJnh8IGFjYy5wcmVwZW5kKHgpLCBMaXN0Ojo8VD46Om5pbCgpKQoJfQoJZm4gY29uY2F0KCZzZWxmLCBvdGhlcjogJlNlbGYpIC0+IFNlbGYgewoJCXNlbGYucmV2KCkuZm9sZCh8YWNjLCAmeHwgYWNjLnByZXBlbmQoeCksIG90aGVyLnJldigpLmZvbGQofGFjYywgJnh8IGFjYy5wcmVwZW5kKHgpLCBMaXN0Ojo8VD46Om5pbCgpKSkKCX0KCWZuIHBhcnRpdGlvbjxGPigmc2VsZiwgZjogRikgLT4gKFNlbGYsIFNlbGYpIHdoZXJlIEY6IEZuKCZUKSAtPiBib29sIHsKCQlzZWxmLnJldigpLmZvbGQoCgkJCXwodHMsIGZzKSwgeHwgaWYgZih4KSB7KHRzLnByZXBlbmQoKngpLCBmcyl9IGVsc2Ugeyh0cywgZnMucHJlcGVuZCgqeCkpfSwKCQkJKExpc3Q6OjxUPjo6bmlsKCksIExpc3Q6OjxUPjo6bmlsKCkpCgkJKQoJfQoJZm4gcXNvcnQoJnNlbGYpIC0+IFNlbGYgewoJCW1hdGNoIHNlbGYgewoJCQlMaXN0OjpOaWwgPT4gTGlzdDo6TmlsLAoJCQlMaXN0OjpDb25zKHBpdm90LCB0YWlsKSA9PiB7CgkJCQlsZXQgKHNtYWxsZXIsIHJlc3QpID0gdGFpbC5wYXJ0aXRpb24ofHh8ICp4IDwgKnBpdm90KTsKCQkJCXNtYWxsZXIucXNvcnQoKS5jb25jYXQoJnJlc3QucXNvcnQoKS5wcmVwZW5kKCpwaXZvdCkpCgkJCX0KCQl9Cgl9Cn0KZm4gbWFpbigpIHsKCWxldCBsaXN0ID0gTGlzdDo6PGkzMj46Om5pbCgpLnByZXBlbmQoNCkucHJlcGVuZCg4KS5wcmVwZW5kKDgpLnByZXBlbmQoMykucmV2KCk7CglsaXN0LmVhY2gofG58IHByaW50ISgie30iLCBuKSk7cHJpbnRsbiEoIiIpOwoJbGlzdC5xc29ydCgpLmVhY2gofG58IHByaW50ISgie30iLCBuKSk7cHJpbnRsbiEoIiIpOwp9Cg==