]> gitweb.factorcode.org Git - factor.git/blob - basis/circular/circular.factor
Delete empty unit tests files, remove 1- and 1+, reorder IN: lines in a lot of places...
[factor.git] / basis / circular / circular.factor
1 ! Copyright (C) 2005, 2006 Alex Chapman, Daniel Ehrenberg
2 ! See http;//factorcode.org/license.txt for BSD license
3 USING: kernel sequences math sequences.private strings
4 accessors ;
5 IN: circular
6
7 ! a circular sequence wraps another sequence, but begins at an
8 ! arbitrary element in the underlying sequence.
9 TUPLE: circular seq start ;
10
11 : <circular> ( seq -- circular )
12     0 circular boa ;
13
14 <PRIVATE
15 : circular-wrap ( n circular -- n circular )
16     [ start>> + ] keep
17     [ seq>> length rem ] keep ; inline
18 PRIVATE>
19
20 M: circular length seq>> length ;
21
22 M: circular virtual@ circular-wrap seq>> ;
23
24 M: circular virtual-seq seq>> ;
25
26 : change-circular-start ( n circular -- )
27     #! change start to (start + n) mod length
28     circular-wrap (>>start) ;
29
30 : rotate-circular ( circular -- )
31     [ 1 ] dip change-circular-start ;
32
33 : push-circular ( elt circular -- )
34     [ set-first ] [ rotate-circular ] bi ;
35
36 : <circular-string> ( n -- circular )
37     0 <string> <circular> ;
38
39 INSTANCE: circular virtual-sequence
40
41 TUPLE: growing-circular < circular length ;
42
43 M: growing-circular length length>> ;
44
45 <PRIVATE
46
47 : full? ( circular -- ? )
48     [ length ] [ seq>> length ] bi = ;
49
50 PRIVATE>
51
52 : push-growing-circular ( elt circular -- )
53     dup full? [ push-circular ]
54     [ [ 1 + ] change-length set-last ] if ;
55
56 : <growing-circular> ( capacity -- growing-circular )
57     { } new-sequence 0 0 growing-circular boa ;