]> gitweb.factorcode.org Git - factor.git/blob - basis/math/ranges/ranges.factor
5acdc43ca3c50eab73957aa04c1081c2a4d4caab
[factor.git] / basis / math / ranges / ranges.factor
1 USING: kernel layouts math math.order namespaces sequences
2 sequences.private accessors ;
3 IN: math.ranges
4
5 TUPLE: range
6 { from read-only }
7 { length read-only }
8 { step read-only } ;
9
10 : <range> ( a b step -- range )
11     >r over - r>
12     [ / 1+ 0 max >integer ] keep
13     range boa ; inline
14
15 M: range length ( seq -- n )
16     length>> ;
17
18 M: range nth-unsafe ( n range -- obj )
19     [ step>> * ] keep from>> + ;
20
21 INSTANCE: range immutable-sequence
22
23 : twiddle 2dup > -1 1 ? ; inline
24
25 : (a, dup roll + -rot ; inline
26
27 : ,b) dup neg rot + swap ; inline
28
29 : [a,b] ( a b -- range ) twiddle <range> ; inline
30
31 : (a,b] ( a b -- range ) twiddle (a, <range> ; inline
32
33 : [a,b) ( a b -- range ) twiddle ,b) <range> ; inline
34
35 : (a,b) ( a b -- range ) twiddle (a, ,b) <range> ; inline
36
37 : [0,b] ( b -- range ) 0 swap [a,b] ; inline
38
39 : [1,b] ( b -- range ) 1 swap [a,b] ; inline
40
41 : [0,b) ( b -- range ) 0 swap [a,b) ; inline
42
43 : range-increasing? ( range -- ? )
44     step>> 0 > ;
45
46 : range-decreasing? ( range -- ? )
47     step>> 0 < ;
48
49 : first-or-peek ( seq head? -- elt )
50     [ first ] [ peek ] if ;
51
52 : range-min ( range -- min )
53     dup range-increasing? first-or-peek ;
54
55 : range-max ( range -- max )
56     dup range-decreasing? first-or-peek ;
57
58 : clamp-to-range ( n range -- n )
59     [ range-min max ] [ range-max min ] bi ;
60
61 : sequence-index-range  ( seq -- range )
62     length [0,b) ;