]> gitweb.factorcode.org Git - factor.git/blob - basis/models/range/range.factor
9a4584a9a290bad9df5c5d0ddc4f25f776485d0c
[factor.git] / basis / models / range / range.factor
1 ! Copyright (C) 2008 Slava Pestov.\r
2 ! See http://factorcode.org/license.txt for BSD license.\r
3 USING: accessors kernel models arrays sequences math math.order\r
4 models.product generalizations sequences.generalizations\r
5 math.functions ;\r
6 FROM: models.product => product ;\r
7 IN: models.range\r
8 \r
9 TUPLE: range < product ;\r
10 \r
11 : <range> ( value page min max step -- range )\r
12     5 narray [ <model> ] map range new-product ;\r
13 \r
14 : range-model ( range -- model ) dependencies>> first ;\r
15 : range-page ( range -- model ) dependencies>> second ;\r
16 : range-min ( range -- model ) dependencies>> third ;\r
17 : range-max ( range -- model ) dependencies>> fourth ;\r
18 : range-step ( range -- model ) dependencies>> 4 swap nth ;\r
19 \r
20 : step-value ( value range -- value' )\r
21     range-step value>> floor-to ;\r
22 \r
23 M: range range-value\r
24     [ range-model value>> ] [ clamp-value ] [ step-value ] tri ;\r
25 \r
26 M: range range-page-value range-page value>> ;\r
27 \r
28 M: range range-min-value range-min value>> ;\r
29 \r
30 M: range range-max-value range-max value>> ;\r
31 \r
32 M: range range-max-value*\r
33     [ range-max-value ] [ range-page-value ] bi [-] ;\r
34 \r
35 M: range set-range-value\r
36     [ clamp-value ] [ range-model ] bi set-model ;\r
37 \r
38 M: range set-range-page-value range-page set-model ;\r
39 \r
40 M: range set-range-min-value range-min set-model ;\r
41 \r
42 M: range set-range-max-value range-max set-model ;\r
43 \r
44 : move-by ( amount range -- )\r
45     [ range-value + ] keep set-range-value ;\r
46 \r
47 : move-by-page ( amount range -- )\r
48     [ range-page-value * ] keep move-by ;\r