
%% one_slot buffer + producer + consumer objects

:-object(one_slot).
	var slot.

	one_slot(N) :-
		main(N).

	get_item(G) :-
		G := slot.

	put_item(P) :-
		slot := P.

	loop(0).
	loop(I) :-
		accept(put_item(P) <== [P+P =:= P*2] ),
		accept(get_item(G)),
		N is I-1,
		loop(N).

	main(I) :-
		format('B ~w one_slot main/1 running~n', [this]),
		loop(I).

:-end_object(one_slot).


:-object(consumer).

	consumer(N,B) :-
		main(N,B).

	loop(0,_).
	loop(I,B) :-
		B<-get_item(X),
		format('C ~w rcv ~w~n', [this, X]),
		N is I-1,
		loop(N,B).

	main(I,B) :-
		format('C ~w consumer main/2 running~n', [this]),
		loop(I,B).

:-end_object(consumer).


:-object(producer).

	producer(N,B) :-
		main(N,B).

	loop(0,_).
	loop(I,B) :-
		format('P ~w snd ~w~n', [this, I]),
		B<-put_item(I),
		N is I-1,
		loop(N,B).

	main(I,B) :-
		format('P ~w producer main/2 running~n', [this]),
		loop(I,B).

:-end_object(producer).


:-object pxslot.

var p.

main :-
	B := new(one_slot(4)),
	C := new(consumer(4,B)),
	p := new(producer(4,B)),
	format('~nB = ~w,~nC = ~w,~np = ~w~n~n', [B,C,p]).

:-end_object pxslot.

