Daniel@0: /* Part of DML (Digital Music Laboratory) Daniel@0: Copyright 2014-2015 Samer Abdallah, University of London Daniel@0: Daniel@0: This program is free software; you can redistribute it and/or Daniel@0: modify it under the terms of the GNU General Public License Daniel@0: as published by the Free Software Foundation; either version 2 Daniel@0: of the License, or (at your option) any later version. Daniel@0: Daniel@0: This program is distributed in the hope that it will be useful, Daniel@0: but WITHOUT ANY WARRANTY; without even the implied warranty of Daniel@0: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the Daniel@0: GNU General Public License for more details. Daniel@0: Daniel@0: You should have received a copy of the GNU General Public Daniel@0: License along with this library; if not, write to the Free Software Daniel@0: Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Daniel@0: */ Daniel@0: Daniel@0: :- module(state, [set_state/2, get_state/2, with_state/3, retract_state/1]). Daniel@0: Daniel@0: :- meta_predicate Daniel@0: with_state(:,+,0), Daniel@0: retract_state(:), Daniel@0: set_state(:,+), Daniel@0: get_state(:,-). Daniel@0: Daniel@0: :- use_module(insist). Daniel@0: :- dynamic state/3. Daniel@0: Daniel@0: get_state(M:Key,Value) :- state(M,Key,Value). Daniel@0: set_state(M:Key,Value) :- Daniel@0: retractall(state(M,Key,_)), Daniel@0: assert(state(M,Key,Value)). Daniel@0: Daniel@0: with_state(M:Key,Value,Goal) :- Daniel@0: insist(\+state(M,Key,_),state_exists(M:Key)), Daniel@0: setup_call_cleanup( Daniel@0: assert(state(M,Key,Value)), Goal, Daniel@0: retract_state(M:Key)). Daniel@0: Daniel@0: retract_state(M:Key) :- retractall(state(M,Key,_)). Daniel@0: Daniel@0: