1 ! Copyright (C) 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: kernel layouts math math.order namespaces sequences
4 sequences.private accessors ;
12 : <range> ( a b step -- range )
13 [ over - ] dip [ /i 1+ 0 max ] keep range boa ; inline
15 M: range length ( seq -- n )
18 M: range nth-unsafe ( n range -- obj )
19 [ step>> * ] keep from>> + ;
21 INSTANCE: range immutable-sequence
23 : twiddle 2dup > -1 1 ? ; inline
25 : (a, dup [ + ] curry 2dip ; inline
27 : ,b) dup [ - ] curry dip ; inline
29 : [a,b] ( a b -- range ) twiddle <range> ; inline
31 : (a,b] ( a b -- range ) twiddle (a, <range> ; inline
33 : [a,b) ( a b -- range ) twiddle ,b) <range> ; inline
35 : (a,b) ( a b -- range ) twiddle (a, ,b) <range> ; inline
37 : [0,b] ( b -- range ) 0 swap [a,b] ; inline
39 : [1,b] ( b -- range ) 1 swap [a,b] ; inline
41 : [0,b) ( b -- range ) 0 swap [a,b) ; inline
43 : range-increasing? ( range -- ? )
46 : range-decreasing? ( range -- ? )
49 : first-or-peek ( seq head? -- elt )
50 [ first ] [ peek ] if ;
52 : range-min ( range -- min )
53 dup range-increasing? first-or-peek ;
55 : range-max ( range -- max )
56 dup range-decreasing? first-or-peek ;
58 : clamp-to-range ( n range -- n )
59 [ range-min max ] [ range-max min ] bi ;
61 : sequence-index-range ( seq -- range )