%
% We use macros because because the
% bb operations are module specific.
% Thus the names are relative to the module
% loading this file
%

:- module( getval, []).

:- multifile
	user:goal_expansion/3.

:- dynamic
	user:goal_expansion/3.

user:goal_expansion( setval(Name,Value), _, bb_put(Name,Value)).
user:goal_expansion( getval(Name,Value), _, bb_get(Name,Value)).
user:goal_expansion( incval(Name,New),	 _, Exp) :-
	Exp = (
		bb_get( Name, Old),
		New is Old+1,
		bb_put( Name, New)
	      ).

user:goal_expansion( decval(Name,New),	 _, Exp) :-
	Exp = (
		bb_get( Name, Old),
		New is Old-1,
		bb_put( Name, New)
	      ).

end_of_file.

setval( Name, Value) :- bb_put( Name, Value).

getval( Name, Value) :- bb_get( Name, Value).

%
% ++i
%
incval( Name, New) :-
	bb_get( Name, O),
	New is O+1,
	bb_put( Name, New).

%
% --i
%
decval( Name, New) :-
	bb_get( Name, O),
	New is O-1,
	bb_put( Name, New).