Skip to content

Instantly share code, notes, and snippets.

View gavinking's full-sized avatar
💭
Say more, more clearly, with @ceylon.

Gavin King gavinking

💭
Say more, more clearly, with @ceylon.
View GitHub Profile
@gavinking
gavinking / vectors.ceylon
Last active December 31, 2015 02:08
Demonstration of how we can "fake" a dependently typed list in Ceylon.
"Encoding of natural numbers at
type level."
interface Nat of Zero|Succ<Nat> {}
"The natural number `0`."
interface Zero satisfies Nat {}
"The natural number `N+1` for a
given natural number `N`."
interface Succ<N>
satisfies Nat
given N satisfies Nat {}
@gavinking
gavinking / composition.ceylon
Last active December 27, 2015 11:39
We can use tuples to define functions with multiple return values. This code example shows how we can use the spread operator and function composition with such functions.
//a function that produces a tuple
[String, String?, String] parseName(String name) {
value it = name.split().iterator();
"first name is required"
assert (is String first = it.next());
"last name is required"
assert (is String second = it.next());
if (is String third = it.next()) {
return [first, second, third];
}
@gavinking
gavinking / tuplecomparatorconstructionkit.ceylon
Last active December 26, 2015 06:39
This demonstrates how we can abstract over tuple types of unknown length, without loss of typesafety, to do something useful, in this case, build comparator functions for tuple types.
/* Three generic functions for building tuple comparators. */
"A comparator function for any `Comparable` type."
Comparison comparator<Type>(Type x, Type y)
given Type satisfies Comparable<Type>
=> x<=>y;
"A comparator function for instances of `[]`."
Comparison emptyComparator([] x, [] y) => equal;
@gavinking
gavinking / gist:6918556
Last active December 25, 2015 04:39
Parallel algorithm for π, originally by Russel Winder
import java.util.concurrent {
Callable,
ScheduledThreadPoolExecutor
}
void execute(Integer numberOfTasks) {
value n = 1G; // same number of iterations as Java
value delta = 1.0 / n;
value startTime = process.nanoseconds;
value sliceSize = n / numberOfTasks;
@gavinking
gavinking / fizzbuzz.ceylon
Last active December 21, 2015 01:19
See how I use a comprehension to pass a lazily evaluated stream of fizzbuzzes to printAll()? Note that a more efficient implementation of printAll() could eaily avoid the string concatenation, thus taking much better advantage of the laziness.
shared void run() => printAll { for (i in 0..50) fizzbuzz(i) };
String fizzbuzz(Integer i)
=> (i%15==0 then "fizzbuzz")
else (i%3==0 then "fizz")
else (i%5==0 then "buzz")
else i.string;
void printAll({String*} strings) => print(", ".join(strings));