-module(produ). -export([buffer/1, bufferInterni/3, producent/2, producentInterni/2, konzument/2, konzumentInterni/2]). -import(lists). bufferInterni(Volno, Mame, Sklad) -> receive % Vydá data, ale jen když nějaká jsou {vydej, Komu} when Mame > 0 -> [Prvni | Zbytek] = Sklad, Komu ! {data, Prvni}, bufferInterni(Volno + 1, Mame - 1, Zbytek); % Přijme data, ale jen když se vejdou {pridej, Od, Data} when Volno > 0 -> Od ! prijato, bufferInterni(Volno - 1, Mame + 1, lists:append(Sklad, [Data])) end. buffer(Velikost) -> spawn(produ, bufferInterni, [Velikost, 0, []]). producentInterni(Buffer, Produkuj) -> % Uděláme data a odešleme Buffer ! {pridej, self(), Produkuj()}, % A až nám je přijmou, uděláme další receive prijato -> producentInterni(Buffer, Produkuj) end. producent(Buffer, Produkuj) -> spawn(produ, producentInterni, [Buffer, Produkuj]). konzumentInterni(Buffer, Konzumuj) -> Buffer ! {vydej, self()}, receive {data, Data} -> Konzumuj(Data), konzumentInterni(Buffer, Konzumuj) end. konzument(Buffer, Konzumuj) -> spawn(produ, konzumentInterni, [Buffer, Konzumuj]).