If you're interested in functional programming, you might also want to checkout my second blog which i'm actively working on!!

Wednesday, March 5, 2014

Ceylon: Sequences and Iterables

Boolean isOdd(Integer number) => number % 2 != 0;
/**
sequence_demo prints
numbers=1..10
oddNumbers={ 1, 3, 5, 7, 9 }
doubledNumbers={ 2, 4, 6, 8, 10, 12, 14, 16, 18, 20 }
sumOfNumbers=55
**/
void sequence_demo() {
Integer[] numbers = 1..10; //here we use the range shortcut notation
print("numbers=``numbers``");
Iterable<Integer> oddNumbers = numbers.filter(isOdd);
print("oddNumbers=``oddNumbers``");
Iterable<Integer> doubledNumbers = numbers.map((Integer number) => number * 2);
print("doubledNumbers=``doubledNumbers``");
Integer sumOfNumbers = numbers.fold(0, (Integer partial, Integer elem) => partial + elem);
print("sumOfNumbers=``sumOfNumbers``");
}
/**
Sequences are per definition nonempty and immutable.
Normally you would start out with the subtype Empty of Sequential (singleton instance empty)
But looking at the API of Empty we don't see any append or add methods
So how do we gradually build a sequence?
There are 2 classes which come to the rescue in this case
- SequenceBuilder (which has a no-arg constructor) => starts from empty.
- SequenceAppender (which takes a sequence as constructor parameter) => starts from non empty sequence
One should however carefully think about whether using a sequencebuilder or sequenceappender is
really necessary. Most of the times you start out from input which you just have to filter or map.
**/
class Manager(shared String name) {}
void buildSequenceDemo() {
String[] names = ["John", "Peter", "Sammy"];
Manager[] managers1 = createManagersFromNames(names);
//however, more idiomatic would have been
{Manager*} managers2 = names.map((String name) => Manager(name));
//we can also use a comprehension
{Manager*} managers3 = {for (name in names) Manager(name)};
//or if you really need a sequence instead of an iterable
Manager[] managers4 = names.map((String name) => Manager(name)).sequence;
//we can also use a comprehension
Manager[] managers5 = [for (name in names) Manager(name)];
}
Manager[] createManagersFromNames(String[] names) {
SequenceBuilder<Manager> sb = SequenceBuilder<Manager>();
for (name in names) {
sb.append(Manager(name));
}
return sb.sequence;
}
void appendDemo() {
/**
Attention: code below does not work because you have to be explicit about
names1 being a NON EMPTY sequence
**/
//String[] names1 = ["John", "Peter", "Sammy"];
[String+] names1 = ["John", "Peter", "Sammy"];
String name = "Ronald";
String[] combined = SequenceAppender(names1).append(name).sequence;
}

No comments:

Post a Comment