| 
									
										
										
										
											2008-02-21 20:14:50 -05:00
										 |  |  | ! Copyright (C) 2006, 2008 Slava Pestov. | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2008-07-04 18:58:37 -04:00
										 |  |  | USING: accessors generic kernel math sequences arrays assocs | 
					
						
							|  |  |  | alarms calendar math.order ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | IN: models | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-04-02 22:27:49 -04:00
										 |  |  | TUPLE: model < identity-tuple | 
					
						
							|  |  |  | value connections dependencies ref locked? ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-07-04 18:58:37 -04:00
										 |  |  | : new-model ( value class -- model )
 | 
					
						
							|  |  |  |     new
 | 
					
						
							|  |  |  |         swap >>value | 
					
						
							|  |  |  |         V{ } clone >>connections | 
					
						
							|  |  |  |         V{ } clone >>dependencies | 
					
						
							|  |  |  |         0 >>ref ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | : <model> ( value -- model )
 | 
					
						
							| 
									
										
										
										
											2008-07-04 18:58:37 -04:00
										 |  |  |     model new-model ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: model hashcode* drop model hashcode* ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : add-dependency ( dep model -- )
 | 
					
						
							| 
									
										
										
										
											2008-08-29 17:03:37 -04:00
										 |  |  |     dependencies>> push ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : remove-dependency ( dep model -- )
 | 
					
						
							| 
									
										
										
										
											2008-08-29 17:03:37 -04:00
										 |  |  |     dependencies>> delete ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | DEFER: add-connection | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | GENERIC: model-activated ( model -- )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: model model-activated drop ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : ref-model ( model -- n )
 | 
					
						
							| 
									
										
										
										
											2008-08-29 17:03:37 -04:00
										 |  |  |     [ 1+ ] change-ref ref>> ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : unref-model ( model -- n )
 | 
					
						
							| 
									
										
										
										
											2008-08-29 17:03:37 -04:00
										 |  |  |     [ 1- ] change-ref ref>> ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : activate-model ( model -- )
 | 
					
						
							|  |  |  |     dup ref-model 1 = [ | 
					
						
							| 
									
										
										
										
											2008-08-29 17:03:37 -04:00
										 |  |  |         dup dependencies>> | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  |         [ dup activate-model dupd add-connection ] each
 | 
					
						
							|  |  |  |         model-activated | 
					
						
							|  |  |  |     ] [ | 
					
						
							|  |  |  |         drop
 | 
					
						
							|  |  |  |     ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | DEFER: remove-connection | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : deactivate-model ( model -- )
 | 
					
						
							|  |  |  |     dup unref-model zero? [ | 
					
						
							| 
									
										
										
										
											2008-08-29 17:03:37 -04:00
										 |  |  |         dup dependencies>> | 
					
						
							| 
									
										
										
										
											2008-01-09 17:36:30 -05:00
										 |  |  |         [ dup deactivate-model remove-connection ] with each
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  |     ] [ | 
					
						
							|  |  |  |         drop
 | 
					
						
							|  |  |  |     ] if ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-16 03:01:45 -05:00
										 |  |  | GENERIC: model-changed ( model observer -- )
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : add-connection ( observer model -- )
 | 
					
						
							| 
									
										
										
										
											2008-08-29 17:03:37 -04:00
										 |  |  |     dup connections>> empty? [ dup activate-model ] when
 | 
					
						
							|  |  |  |     connections>> push ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : remove-connection ( observer model -- )
 | 
					
						
							| 
									
										
										
										
											2008-08-29 17:03:37 -04:00
										 |  |  |     [ connections>> delete ] keep
 | 
					
						
							|  |  |  |     dup connections>> empty? [ dup deactivate-model ] when
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  |     drop ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-16 03:01:45 -05:00
										 |  |  | : with-locked-model ( model quot -- )
 | 
					
						
							|  |  |  |     swap
 | 
					
						
							| 
									
										
										
										
											2008-08-29 17:03:37 -04:00
										 |  |  |     t >>locked? | 
					
						
							| 
									
										
										
										
											2007-11-16 03:01:45 -05:00
										 |  |  |     slip | 
					
						
							| 
									
										
										
										
											2008-08-29 17:03:37 -04:00
										 |  |  |     f >>locked? drop ; inline
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-16 03:01:45 -05:00
										 |  |  | GENERIC: update-model ( model -- )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: model update-model drop ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-01-09 04:52:08 -05:00
										 |  |  | : notify-connections ( model -- )
 | 
					
						
							| 
									
										
										
										
											2008-08-29 17:03:37 -04:00
										 |  |  |     dup connections>> [ model-changed ] with each ;
 | 
					
						
							| 
									
										
										
										
											2008-01-09 04:52:08 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-16 03:01:45 -05:00
										 |  |  | : set-model ( value model -- )
 | 
					
						
							| 
									
										
										
										
											2008-08-29 17:03:37 -04:00
										 |  |  |     dup locked?>> [ | 
					
						
							| 
									
										
										
										
											2007-11-16 03:01:45 -05:00
										 |  |  |         2drop
 | 
					
						
							|  |  |  |     ] [ | 
					
						
							|  |  |  |         dup [ | 
					
						
							| 
									
										
										
										
											2008-08-29 17:03:37 -04:00
										 |  |  |             swap >>value | 
					
						
							|  |  |  |             [ update-model ] [ notify-connections ] bi
 | 
					
						
							| 
									
										
										
										
											2007-11-16 03:01:45 -05:00
										 |  |  |         ] with-locked-model | 
					
						
							|  |  |  |     ] if ;
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : ((change-model)) ( model quot -- newvalue model )
 | 
					
						
							| 
									
										
										
										
											2008-12-03 09:46:16 -05:00
										 |  |  |     over [ [ value>> ] dip call ] dip ; inline
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | : change-model ( model quot -- )
 | 
					
						
							|  |  |  |     ((change-model)) set-model ; inline
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : (change-model) ( model quot -- )
 | 
					
						
							| 
									
										
										
										
											2008-08-29 17:50:31 -04:00
										 |  |  |     ((change-model)) (>>value) ; inline
 | 
					
						
							| 
									
										
										
										
											2007-09-20 18:09:08 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | GENERIC: range-value ( model -- value )
 | 
					
						
							|  |  |  | GENERIC: range-page-value ( model -- value )
 | 
					
						
							|  |  |  | GENERIC: range-min-value ( model -- value )
 | 
					
						
							|  |  |  | GENERIC: range-max-value ( model -- value )
 | 
					
						
							|  |  |  | GENERIC: range-max-value* ( model -- value )
 | 
					
						
							|  |  |  | GENERIC: set-range-value ( value model -- )
 | 
					
						
							|  |  |  | GENERIC: set-range-page-value ( value model -- )
 | 
					
						
							|  |  |  | GENERIC: set-range-min-value ( value model -- )
 | 
					
						
							|  |  |  | GENERIC: set-range-max-value ( value model -- )
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | : clamp-value ( value range -- newvalue )
 | 
					
						
							|  |  |  |     [ range-min-value max ] keep
 | 
					
						
							|  |  |  |     range-max-value* min ;
 |