]> gitweb.factorcode.org Git - factor.git/blob - basis/models/models-docs.factor
Solution to Project Euler problem 65
[factor.git] / basis / models / models-docs.factor
1 USING: help.syntax help.markup kernel math classes classes.tuple
2 calendar ;
3 IN: models
4
5 HELP: model
6 { $class-description "A mutable cell holding a single value. When the value is changed, a sequence of connected objects are notified. Models have the following slots:"
7     { $list
8         { { $slot "value" } " - the value of the model. Use " { $link set-model } " to change the value." }
9         { { $slot "connections" } " - a sequence of objects implementing the " { $link model-changed } " generic word, to be notified when the model's value changes." }
10         { { $slot "dependencies" } " - a sequence of models which should have this model added to their sequence of connections when activated." }
11         { { $slot "ref" } " - a reference count tracking the number of models which depend on this one." }
12         { { $slot "locked?" } " - a slot set by " { $link with-locked-model } " to ensure that the model doesn't get changed recursively" }
13     }
14 "Other classes may inherit from " { $link model } "."
15 } ;
16
17 HELP: <model>
18 { $values { "value" object } { "model" "a new " { $link model } } }
19 { $description "Creates a new model with an initial value." } ;
20
21 HELP: add-dependency
22 { $values { "dep" model } { "model" model } }
23 { $description "Registers a dependency. When " { $snippet "model" } " is activated, it will be added to " { $snippet "dep" } "'s connections and notified when " { $snippet "dep" } " changes." }
24 { $notes "This word should not be called directly unless you are implementing your own model class." } ;
25
26 { add-dependency remove-dependency activate-model deactivate-model } related-words
27
28 HELP: remove-dependency
29 { $values { "dep" model } { "model" model } }
30 { $description "Unregisters a dependency." }
31 { $notes "This word should not be called directly unless you are implementing your own model class." } ;
32
33 HELP: model-activated
34 { $values { "model" model } }
35 { $contract "Called after a model has been activated." } ;
36
37 { model-activated activate-model deactivate-model } related-words
38
39 HELP: activate-model
40 { $values { "model" model } }
41 { $description "Increments the reference count of the model. If it was previously zero, this model is added as a connection to all models registered as dependencies by " { $link add-dependency } "." }
42 { $warning "Calls to " { $link activate-model } " and " { $link deactivate-model } " should be balanced to keep the reference counting consistent, otherwise " { $link model-changed } " might be called at the wrong time or not at all." } ;
43
44 HELP: deactivate-model
45 { $values { "model" model } }
46 { $description "Decrements the reference count of the model. If it reaches zero, this model is removed as a connection from all models registered as dependencies by " { $link add-dependency } "." }
47 { $warning "Calls to " { $link activate-model } " and " { $link deactivate-model } " should be balanced to keep the reference counting consistent, otherwise " { $link model-changed } " might be called at the wrong time or not at all." } ;
48
49 HELP: model-changed
50 { $values { "model" model } { "observer" object } }
51 { $contract "Called to notify observers of a model that the model value has changed as a result of a call to " { $link set-model } ". Observers can be registered with " { $link add-connection } "." } ;
52
53 { add-connection remove-connection model-changed } related-words
54
55 HELP: add-connection
56 { $values { "observer" object } { "model" model } }
57 { $contract "Registers an object interested in being notified of changes to the model's value. When the value is changed as a result of a call to " { $link set-model } ", the " { $link model-changed } " word is called on the observer." } ;
58
59 HELP: remove-connection
60 { $values { "observer" object } { "model" model } }
61 { $contract "Unregisters an object no longer interested in being notified of changes to the model's value." } ;
62
63 HELP: set-model
64 { $values { "value" object } { "model" model } }
65 { $description "Changes the value of a model and calls " { $link model-changed } " on all observers registered with " { $link add-connection } "." } ;
66
67 { set-model change-model (change-model) } related-words
68
69 HELP: change-model
70 { $values { "model" model } { "quot" { $quotation "( obj -- newobj )" } } }
71 { $description "Applies the quotation to the current value of the model to yield a new value, then changes the value of the model to the new value, and calls " { $link model-changed } " on all observers registered with " { $link add-connection } "." } ;
72
73 HELP: (change-model)
74 { $values { "model" model } { "quot" { $quotation "( obj -- newobj )" } } }
75 { $description "Applies the quotation to the current value of the model to yield a new value, then changes the value of the model to the new value without notifying any observers registered with " { $link add-connection } "." }
76 { $notes "There are very few reasons for user code to call this word. Instead, call " { $link change-model } ", which notifies observers." } ;
77
78 HELP: range-value
79 { $values { "model" model } { "value" object } }
80 { $contract "Outputs the current value of a range model." } ;
81
82 HELP: range-page-value
83 { $values { "model" model } { "value" object } }
84 { $contract "Outputs the page size of a range model." } ;
85
86 HELP: range-min-value
87 { $values { "model" model } { "value" object } }
88 { $contract "Outputs the minimum value of a range model." } ;
89
90 HELP: range-max-value
91 { $values { "model" model } { "value" object } }
92 { $contract "Outputs the maximum value of a range model." } ;
93
94 HELP: range-max-value*
95 { $values { "model" model } { "value" object } }
96 { $contract "Outputs the slider position for a range model. Since the bottom of the slider cannot exceed the maximum value, this is equal to the maximum value minus the page size." } ;
97
98 HELP: set-range-value
99 { $values { "value" object } { "model" model } }
100 { $description "Sets the current value of a range model." } 
101 { $side-effects "model" } ;
102
103 HELP: set-range-page-value
104 { $values { "value" object } { "model" model } }
105 { $description "Sets the page size of a range model." } 
106 { $side-effects "model" } ;
107
108 HELP: set-range-min-value
109 { $values { "value" object } { "model" model } }
110 { $description "Sets the minimum value of a range model." } 
111 { $side-effects "model" } ;
112
113 HELP: set-range-max-value
114 { $values { "value" object } { "model" model } }
115 { $description "Sets the maximum value of a range model." }
116 { $side-effects "model" } ;
117
118 ARTICLE: "models" "Models"
119 "The " { $vocab-link "models" } " vocabulary provides basic support for dataflow programming. A model is an observable value. Changing a model's value notifies other objects which depend on the model automatically, and models may depend on each other's values."
120 $nl
121 "The class of models:"
122 { $subsection model }
123 "Creating models:"
124 { $subsection <model> }
125 "Adding and removing connections:"
126 { $subsection add-connection }
127 { $subsection remove-connection }
128 "Generic word called on model connections when the model value changes:"
129 { $subsection model-changed }
130 "When using models which are not associated with controls (or when unit testing controls), you must activate and deactivate models manually:"
131 { $subsection activate-model }
132 { $subsection deactivate-model }
133 { $subsection "models-impl" }
134 { $subsection "models.arrow" }
135 { $subsection "models.product" }
136 { $subsection "models-range" }
137 { $subsection "models-delay" } ;
138
139 ARTICLE: "models-impl" "Implementing models"
140 "New types of models can be defined, for example see " { $vocab-link "models.arrow" } "."
141 $nl
142 "Models can execute hooks when activated:"
143 { $subsection model-activated }
144 "Models can override requests to change their value, for example to perform validation:"
145 { $subsection set-model } ;
146
147 ABOUT: "models"