90 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
		
		
			
		
	
	
			90 lines
		
	
	
		
			2.5 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| 
								 | 
							
								/*  $Id: clp_events.pl,v 1.1 2005-10-28 17:53:27 vsc Exp $
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    Part of SWI-Prolog
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    Author:        Tom Schrijvers
							 | 
						||
| 
								 | 
							
								    E-mail:        tom.schrijvers@cs.kuleuven.ac.be
							 | 
						||
| 
								 | 
							
								    WWW:           http://www.swi-prolog.org
							 | 
						||
| 
								 | 
							
								    Copyright (C): 2005, K.U.Leuven
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    This program is free software; you can redistribute it and/or
							 | 
						||
| 
								 | 
							
								    modify it under the terms of the GNU General Public License
							 | 
						||
| 
								 | 
							
								    as published by the Free Software Foundation; either version 2
							 | 
						||
| 
								 | 
							
								    of the License, or (at your option) any later version.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    This program is distributed in the hope that it will be useful,
							 | 
						||
| 
								 | 
							
								    but WITHOUT ANY WARRANTY; without even the implied warranty of
							 | 
						||
| 
								 | 
							
								    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
							 | 
						||
| 
								 | 
							
								    GNU General Public License for more details.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    You should have received a copy of the GNU Lesser General Public
							 | 
						||
| 
								 | 
							
								    License along with this library; if not, write to the Free Software
							 | 
						||
| 
								 | 
							
								    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    As a special exception, if you link this library with other files,
							 | 
						||
| 
								 | 
							
								    compiled with a Free Software compiler, to produce an executable, this
							 | 
						||
| 
								 | 
							
								    library does not by itself cause the resulting executable to be covered
							 | 
						||
| 
								 | 
							
								    by the GNU General Public License. This exception does not however
							 | 
						||
| 
								 | 
							
								    invalidate any other reasons why the executable file might be covered by
							 | 
						||
| 
								 | 
							
								    the GNU General Public License.
							 | 
						||
| 
								 | 
							
								*/
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
							 | 
						||
| 
								 | 
							
								%
							 | 
						||
| 
								 | 
							
								% Module for managing constraint solver events.
							 | 
						||
| 
								 | 
							
								%
							 | 
						||
| 
								 | 
							
								% Author: 	Tom Schrijvers
							 | 
						||
| 
								 | 
							
								% E-mail: 	tom.schrijvers@cs.kuleuven.ac.be
							 | 
						||
| 
								 | 
							
								% Copyright:	2005, K.U.Leuven
							 | 
						||
| 
								 | 
							
								%
							 | 
						||
| 
								 | 
							
								%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
							 | 
						||
| 
								 | 
							
								:-module(clp_events,
							 | 
						||
| 
								 | 
							
									[
							 | 
						||
| 
								 | 
							
										notify/2,
							 | 
						||
| 
								 | 
							
										subscribe/4,
							 | 
						||
| 
								 | 
							
										unsubscribe/2
							 | 
						||
| 
								 | 
							
									]).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								notify(V,NMod) :-
							 | 
						||
| 
								 | 
							
									( get_attr(V,clp_events,List) ->
							 | 
						||
| 
								 | 
							
										notify_list(List,NMod)
							 | 
						||
| 
								 | 
							
									;
							 | 
						||
| 
								 | 
							
										true
							 | 
						||
| 
								 | 
							
									).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								subscribe(V,NMod,SMod,Goal) :-
							 | 
						||
| 
								 | 
							
									( get_attr(V,clp_events,List) ->
							 | 
						||
| 
								 | 
							
										put_attr(V,clp_events,[entry(NMod,SMod,Goal)|List])
							 | 
						||
| 
								 | 
							
									;
							 | 
						||
| 
								 | 
							
									        put_attr(V,clp_events,[entry(NMod,SMod,Goal)])
							 | 
						||
| 
								 | 
							
									).	
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								unsubscribe(V,SMod) :-
							 | 
						||
| 
								 | 
							
									( get_attr(V,clp_events,List) ->
							 | 
						||
| 
								 | 
							
										unsubscribe_list(List,SMod,NList),
							 | 
						||
| 
								 | 
							
										put_attr(V,clp_events,NList)
							 | 
						||
| 
								 | 
							
									;
							 | 
						||
| 
								 | 
							
										true
							 | 
						||
| 
								 | 
							
									).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								notify_list([],_).
							 | 
						||
| 
								 | 
							
								notify_list([entry(Mod,_,Goal)|Rest],NMod) :-
							 | 
						||
| 
								 | 
							
									( Mod == NMod ->
							 | 
						||
| 
								 | 
							
										call(Goal)
							 | 
						||
| 
								 | 
							
									;
							 | 
						||
| 
								 | 
							
										true
							 | 
						||
| 
								 | 
							
									),
							 | 
						||
| 
								 | 
							
									notify_list(Rest,NMod).
							 | 
						||
| 
								 | 
							
									
							 | 
						||
| 
								 | 
							
								unsubscribe_list([],_,_).
							 | 
						||
| 
								 | 
							
								unsubscribe_list([Entry|Rest],SMod,List) :-
							 | 
						||
| 
								 | 
							
									Entry = entry(_,Mod,_),
							 | 
						||
| 
								 | 
							
									( Mod == SMod ->
							 | 
						||
| 
								 | 
							
										List = Rest
							 | 
						||
| 
								 | 
							
									;	
							 | 
						||
| 
								 | 
							
										List = [Entry|Tail],
							 | 
						||
| 
								 | 
							
										unsubscribe_list(Rest,SMod,Tail)
							 | 
						||
| 
								 | 
							
									).
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								attr_unify_hook(_,_).
							 |