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 / 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));
@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 / 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 / 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 / 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 / genericVectors.ceylon
Last active January 1, 2016 17:19
Generalization of Vec over element types.
"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 / mapLagging.ceylon
Last active January 3, 2016 02:09
A cool way to define moving averages, demonstrating a very advanced use of reified generics.
import ceylon.collection {
LinkedList
}
import ceylon.math.float {
sin,
pi
}
"Map a function of arity `n` to a stream of values. In each
@gavinking
gavinking / memoize.ceylon
Last active September 7, 2017 15:21
A useful generic function to memoize a function or method, or canonicalize a class. (Tested on Ceylon 1.1 - may not work in 1.0.)
"A generic function that produces a memoized version
of the given [[function|fun]]. Works for any function
arity."
Callable<Return,Args> memoize<Return,Args>(Callable<Return,Args> fun)
given Args satisfies Anything[] {
value cache = HashMap<Args,Return&Object|Finished>();
function callFun(Args args) {
//we'll use finished as a convenient
//unit value to represent the case
//that the function returned null
@gavinking
gavinking / serialization.ceylon
Last active August 29, 2015 14:10
playing with serialization
import ceylon.language.serialization {
serialization,
Deconstructor
}
import ceylon.language.meta.model {
ClassModel,
Type
}
import ceylon.language.meta.declaration {
ValueDeclaration,
"Finds the (last) longest substring that contains
at most two unique characters"
String longest2UniqueCharSubstring(String s)
=> let (init = [[0, 0, 0, 0], 0, '\0', '\0'],
mpos = s.fold(init)((acc,ch)
=> let ([[mb,me,cb,ce],cb1,ch0,ch1] = acc,
ce1 = ce+1,
max = (Integer b, Integer e)
=> me-mb > e-b then [mb,me,b,e]
else [b,e,b,e])