func foo(peers: []PeerId) -> string:
-- Store a list of peer IDs collected from somewhere
-- This is a stream (denoted by *, which means "0 or more values")
-- Will go to all peers in parallel
-- Move execution flow to the peer p
-- Get a peer ID from a service call (called on p)
-- You can think of resp2 as a locally consistent lazy list
-- What is the value of resp at this point?
-- Keep an eye on the `par` there: actually, it's FORKing execution
-- to several branches on different peers.
-- Move execution to peer r
-- Wait for 6 responses on resp2: it's JOIN
-- Once we have 6 responses, merge them
-- Function treats resp2 as an array of strings, and concatenates all
-- of them into a single string.
-- This function call "fixes" the content of resp2, making a single observation.
-- This is a "stream canonicalization" event: values, order, and length
-- is fixed at the moment of first function call, function will not be called
-- again, with different data.
-- You can keep writing to a stream after it's value is used