]> gitweb.factorcode.org Git - factor.git/blob - basis/models/models.factor
Delete empty unit tests files, remove 1- and 1+, reorder IN: lines in a lot of places...
[factor.git] / basis / models / models.factor
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 alarms calendar math.order continuations fry ;
5 IN: models
6
7 TUPLE: model < identity-tuple
8 value connections dependencies ref locked? ;
9
10 : new-model ( value class -- model )
11     new
12         swap >>value
13         V{ } clone >>connections
14         V{ } clone >>dependencies
15         0 >>ref ; inline
16
17 : <model> ( value -- model )
18     model new-model ;
19
20 M: model hashcode* drop model hashcode* ;
21
22 : add-dependency ( dep model -- )
23     dependencies>> push ;
24
25 : remove-dependency ( dep model -- )
26     dependencies>> delete ;
27
28 DEFER: add-connection
29
30 GENERIC: model-activated ( model -- )
31
32 M: model model-activated drop ;
33
34 : ref-model ( model -- n )
35     [ 1 + ] change-ref ref>> ;
36
37 : unref-model ( model -- n )
38     [ 1 - ] change-ref ref>> ;
39
40 : activate-model ( model -- )
41     dup ref-model 1 = [
42         dup dependencies>>
43         [ dup activate-model dupd add-connection ] each
44         model-activated
45     ] [
46         drop
47     ] if ;
48
49 DEFER: remove-connection
50
51 : deactivate-model ( model -- )
52     dup unref-model zero? [
53         dup dependencies>>
54         [ dup deactivate-model remove-connection ] with each
55     ] [
56         drop
57     ] if ;
58
59 GENERIC: model-changed ( model observer -- )
60
61 : add-connection ( observer model -- )
62     dup connections>> empty? [ dup activate-model ] when
63     connections>> push ;
64
65 : remove-connection ( observer model -- )
66     [ connections>> delete ] keep
67     dup connections>> empty? [ dup deactivate-model ] when
68     drop ;
69
70 : with-locked-model ( model quot -- )
71     [ '[ _ t >>locked? @ ] ]
72     [ drop '[ _ f >>locked? drop ] ]
73     2bi [ ] cleanup ; inline
74
75 GENERIC: update-model ( model -- )
76
77 M: model update-model drop ;
78
79 : notify-connections ( model -- )
80     dup connections>> [ model-changed ] with each ;
81
82 : set-model ( value model -- )
83     dup locked?>> [
84         2drop
85     ] [
86         [
87             swap >>value
88             [ update-model ] [ notify-connections ] bi
89         ] with-locked-model
90     ] if ;
91
92 : ((change-model)) ( model quot -- newvalue model )
93     over [ [ value>> ] dip call ] dip ; inline
94
95 : change-model ( model quot -- )
96     ((change-model)) set-model ; inline
97
98 : (change-model) ( model quot -- )
99     ((change-model)) (>>value) ; inline
100
101 GENERIC: range-value ( model -- value )
102 GENERIC: range-page-value ( model -- value )
103 GENERIC: range-min-value ( model -- value )
104 GENERIC: range-max-value ( model -- value )
105 GENERIC: range-max-value* ( model -- value )
106 GENERIC: set-range-value ( value model -- )
107 GENERIC: set-range-page-value ( value model -- )
108 GENERIC: set-range-min-value ( value model -- )
109 GENERIC: set-range-max-value ( value model -- )
110
111 : clamp-value ( value range -- newvalue )
112     [ range-min-value ] [ range-max-value* ] bi clamp ;