Course of Raku / Functional, concurrent, reactive, and web programming / Functional programming / Data feeds

The backward feed

Every feed so far has flowed forward with ==>, from a source on the left into a target on the right. Raku also has the mirror operator, <==, the backward feed. It runs the other way round: the target sits on the left, and the data is pulled in from the source on the right.

Here is the even-numbers pipeline from before, written backward:

my @evens <== grep(* %% 2) <== (1..10);
say @evens; # [2 4 6 8 10]

Read it right to left: take 1..10, keep the even numbers, and collect them into @evens. The result is exactly the same as (1..10) ==> grep(* %% 2) ==> my @evens — only the direction in which you write the stages has changed.

Backward feeds chain in the same way, and again the target leads:

my @result <== map(* ** 2) <== grep(* %% 2) <== (1..10);
say @result; # [4 16 36 64 100]

The work still happens source-first — start with 1..10, keep the evens, square them — but on the page the stages are listed from the destination back towards the origin. The order of the elements is untouched; <== changes only the reading direction, never the data.

Because code usually reads left to right, the forward ==> tends to read more naturally: you meet the data first and follow it to where it lands. The backward <== is there for the occasions when leading with the destination tells the story better — naming what you are building before what it is built from. The two are exact mirrors, so choose whichever direction reads best.

Practice

Complete the quiz that covers the contents of this topic.

Course navigation

Quiz — Feeds   |   Quiz — The backward feed


💪 Or jump directly to the exercises in this section.