Skip to content

Chaining

_.m supports method chaining for a fluent API style.

Wraps an object to enable chaining. Call value() to unwrap.

A* lyrics = AA(@[@"I'm", @"a", @"little", @"teapot"]);
S* song = __(lyrics)
.map(^id(S* word, ...) { return [word uppercaseString]; })
.reduce(^id(S* memo, S* word, ...) {
return [memo stringByAppendingFormat:@" %@", word];
}, @"")
.value();
// => " I'M A LITTLE TEAPOT"

Starts a chain. All future method calls return wrapped objects.

A* stooges = AA(@[
OKV({@"name", @"curly"}, {@"age", N.I(25)}),
OKV({@"name", @"moe"}, {@"age", N.I(21)}),
OKV({@"name", @"larry"}, {@"age", N.I(23)})
]);
S* youngest = _.chain(stooges)
.sortBy(^id(O* stooge, ...) { return stooge[@"age"]; })
.map(^id(O* stooge, ...) {
return [NSString stringWithFormat:@"%@ is %@",
stooge[@"name"], stooge[@"age"]];
})
.first()
.value();
// => "moe is 21"

Extracts the value of a wrapped object.

A* result = __(AI(1, 2, 3)).value();
// => [1, 2, 3]
// Without chaining
A* filtered = _.filter(list, predicate);
A* mapped = _.map(filtered, transform);
A* sorted = _.sortBy(mapped, comparator);
id first = _.first(sorted);
// With chaining - much cleaner!
id result = _.chain(list)
.filter(predicate)
.map(transform)
.sortBy(comparator)
.first()
.value();