1 ! Copyright (C) 2006, 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors generic kernel math sequences arrays assocs
4 calendar math.order continuations fry ;
7 TUPLE: model < identity-tuple
8 value connections dependencies ref locked? ;
10 : new-model ( value class -- model )
13 V{ } clone >>connections
14 V{ } clone >>dependencies
17 : <model> ( value -- model )
20 : add-dependency ( dep model -- )
23 : remove-dependency ( dep model -- )
24 dependencies>> remove! drop ;
28 GENERIC: model-activated ( model -- )
30 M: model model-activated drop ;
32 : ref-model ( model -- n )
33 [ 1 + dup ] change-ref drop ;
35 : unref-model ( model -- n )
36 [ 1 - dup ] change-ref drop ;
38 : activate-model ( model -- )
41 [ dup activate-model dupd add-connection ] each
47 DEFER: remove-connection
49 : deactivate-model ( model -- )
50 dup unref-model zero? [
52 [ dup deactivate-model remove-connection ] with each
57 : compute-model ( model -- value )
58 [ activate-model ] [ deactivate-model ] [ value>> ] tri ;
60 GENERIC: model-changed ( model observer -- )
62 : add-connection ( observer model -- )
64 [ empty? [ activate-model ] [ drop ] if ]
67 : remove-connection ( observer model -- )
68 [ connections>> remove! ] keep swap
69 empty? [ deactivate-model ] [ drop ] if ;
71 : with-locked-model ( model quot -- )
72 [ '[ _ t >>locked? @ ] ]
73 [ drop '[ f _ locked?<< ] ]
76 GENERIC: update-model ( model -- )
78 M: model update-model drop ;
80 : notify-connections ( model -- )
81 dup connections>> [ model-changed ] with each ;
83 : set-model ( value model -- )
89 [ update-model ] [ notify-connections ] bi
93 : ?set-model ( value model -- )
94 2dup value>> = [ 2drop ] [ set-model ] if ;
96 : call-change-model ( model quot -- newvalue model )
97 over [ [ value>> ] dip call ] dip ; inline
99 : change-model ( ..a model quot: ( ..a obj -- ..b newobj ) -- ..b )
100 call-change-model set-model ; inline
102 : (change-model) ( ..a model quot: ( ..a obj -- ..b newobj ) -- ..b )
103 call-change-model value<< ; inline
105 GENERIC: range-value ( model -- value )
106 GENERIC: range-page-value ( model -- value )
107 GENERIC: range-min-value ( model -- value )
108 GENERIC: range-max-value ( model -- value )
109 GENERIC: range-max-value* ( model -- value )
110 GENERIC: set-range-value ( value model -- )
111 GENERIC: set-range-page-value ( value model -- )
112 GENERIC: set-range-min-value ( value model -- )
113 GENERIC: set-range-max-value ( value model -- )
115 : clamp-value ( value range -- newvalue )
116 [ range-min-value ] [ range-max-value* ] bi clamp ;
118 : change-model* ( ..a model quot: ( ..a obj -- ..b ) -- ..b )
119 '[ _ keep ] change-model ; inline
121 : push-model ( value model -- )
122 [ push ] change-model* ;
124 : pop-model ( model -- value )
125 [ pop ] change-model* ;