1 ! Copyright (C) 2005, 2006 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
4 USING: errors generic kernel math sequences-internals vectors ;
6 ! A reversal of an underlying sequence.
9 : reversed@ ( m reversed -- n seq )
10 reversed-seq [ length swap - 1- ] keep ; inline
12 M: reversed length reversed-seq length ;
14 M: reversed nth reversed@ nth ;
16 M: reversed nth-unsafe reversed@ nth-unsafe ;
18 M: reversed set-nth reversed@ set-nth ;
20 M: reversed set-nth-unsafe
21 reversed@ set-nth-unsafe ;
23 M: reversed like reversed-seq like ;
25 M: reversed new reversed-seq new ;
27 : reverse ( seq -- newseq ) [ <reversed> ] keep like ;
29 ! A slice of another sequence.
30 TUPLE: slice seq from to ;
32 : collapse-slice ( from to slice -- from to seq )
33 dup slice-from swap slice-seq >r tuck + >r + r> r> ;
35 TUPLE: slice-error reason ;
36 : slice-error ( str -- * ) <slice-error> throw ;
38 : check-slice ( from to seq -- )
39 pick 0 < [ "start < 0" slice-error ] when
40 length over < [ "end > sequence" slice-error ] when
41 > [ "start > end" slice-error ] when ;
43 C: slice ( m n seq -- slice )
44 #! A slice of a slice collapses.
45 >r dup slice? [ collapse-slice ] when r>
46 >r 3dup check-slice r>
47 [ set-slice-seq ] keep
49 [ set-slice-from ] keep ;
52 dup slice-to swap slice-from - ;
54 : slice@ ( m slice -- n seq )
55 [ slice-from + ] keep slice-seq ; inline
57 M: slice nth slice@ nth ;
59 M: slice nth-unsafe slice@ nth-unsafe ;
61 M: slice set-nth slice@ set-nth ;
63 M: slice set-nth-unsafe slice@ set-nth-unsafe ;
65 M: slice like slice-seq like ;
67 M: slice new slice-seq new ;
69 TUPLE: column seq col ;
71 : column@ ( m column -- n seq )
72 dup column-col -rot column-seq nth ;
74 M: column length column-seq length ;
76 M: column nth column@ nth ;
78 M: column set-nth column@ set-nth ;
80 M: column like column-seq like ;
82 M: column new column-seq new ;