1 USING: kernel sequences math generic sequences-internals ;
4 ! a circular sequence wraps another sequence, but begins at an arbitrary
5 ! element in the underlying sequence.
6 TUPLE: circular start ;
8 C: circular ( seq circular -- circular )
9 0 over set-circular-start [ set-delegate ] keep ;
11 : circular@ ( n circular -- n seq )
12 [ tuck circular-start + swap length mod ] keep delegate ;
14 M: circular nth ( n seq -- elt ) bounds-check circular@ nth ;
16 M: circular nth-unsafe ( n seq -- elt ) circular@ nth-unsafe ;
18 M: circular set-nth ( elt n seq -- ) bounds-check circular@ set-nth ;
20 M: circular set-nth-unsafe ( elt n seq -- ) circular@ set-nth-unsafe ;
22 : change-circular-start ( n circular -- )
23 #! change start to (start + n) mod length
24 [ circular@ drop ] keep set-circular-start ;