Egyszerű streameket használó programok
type stream = [ int(integer),eos];
innentől a csatornákon lévő adatok az int szóval prefixelt integer számok és a végén egy eos szignál jön.
Generáló program
Generál egy a számtani sorozatot a 0-dik tagjától az n-1-dik tagjáig, ahol ai=a+i*b és ezt egy csatornára teszi (az adatokat egy eos szignál zárja).
agent generate(out: stream,a,b,n:integer);
var i:integer;
begin
i:=0;
while i<n do
begin
out!int(a+i*b);i:=i+1
end;
out!eos
end;
Másoló program
Az input csatornán lévő adatokat átmásolja az output csatornára.
agent copy(inp,out:stream);
var more:boolean; x: integer;
begin
more:=true;
while more do
poll
inp?int(x) ->out!int(x) |
inp?eos -> more :=false
end;
out!eos
end;
Összefésülő program
A két input csatornán lévő adatokat az output csatornára írja. Az adatok sorrendje csak annyiban meghatározott, hogy ha egy adat az egyik input csatornáról jött akkor az őt követő ugyanarról a csatornáról jövő adatok az output csatornán is később következnek.
agent merge(inp1,inp2,out:stream);
var n,x:integer;
begin
n:=0;
while n<2 do
poll
inp1?int(x) -> out!int(x) |
inp1?eos -> n:=n+1 |
inp2?int(x) -> out!int(x) |
inp2?eos -> n:=n+1
end;
out!eos
end;
Egyszerűsítő program
Egy olyan csatornából, amin az adatok monoton növekvő sorrendben következnek egymás után, csinál egy olyat amin szigorúan monoton növekvő sorrendben következnek egymás után. Kiszűri azokat az adatokat, amik többször szerepelnek az inputban, és csak egyszer írja ki őket az outputra.
agent suppress(inp,out:stream);
var more: boolean; x,y:integer;
begin
poll
inp?int(x) -> more :=true |
inp?eos -> more :=false
end;
while more do
poll
inp?int(y) -> if x<>y then
begin
out!int(x); x:=y
end |
inp?eos -> out!int(x) more:=false
end;
out!eos
end;
Iteratív buffer
A buffert 10 csatornával reprezentáljuk, amik egymásról másolják az adatokat.
agent buffer(inp,out:stream);
const n=9;
type net = array [1..n] of stream;
use copy;
var a:net; i:integer;
begin
+a[1];copy(inp,a[1]); i:=2;
while i<=n do
begin
+a[i];copy(a[i-1],a[i]); i:=i+1
end;
copy(a[n],out)
end;
Rekurzív buffer
Ugyanaz, mint az előbb csak most rekurzívan.
agent buffer(n:integer;inp,out:stream);
use copy;
var succ:stream;
begin
if n=1 then copy (inp,out)
else
begin
+succ;copy(inp,succ);
buffer(n-1,succ,out)
end
end;
Rekurzív rendezés
Működése a következő, ha a csatornán van még adat, akkor a csatornáról kiválasztja a legkisebb elemet, a többit meg egy közbeeső csatornára továbbítja, amire alkalmazza a rekurzív rendezést, a megszerzett legkisebb adatot pedig kiírja az output csatornára, ha nincs több adat, akkor befejezi a futását.
agent sort(inp,out:stream);
var more:boolen; x,y:integer;
succ:stream;
begin
poll
inp?int(x)-> +succ;
sort(succ,out); more:=true |
inp?eos->out!eos; more=false
end;
while more do
poll
inp?int(y)-> if x>y then
begin
succ!int(x);x:=y
end
else succ!int(y) |
inp?eos -> out!int(x); succ!eos; more:=false
end
end;