2007-09-20 18:09:08 -04:00
|
|
|
! Copyright (C) 2005, 2006 Alex Chapman, Daniel Ehrenberg
|
2012-09-11 13:33:47 -04:00
|
|
|
! See http://factorcode.org/license.txt for BSD license
|
2008-04-13 01:52:49 -04:00
|
|
|
USING: kernel sequences math sequences.private strings
|
2009-12-06 18:20:46 -05:00
|
|
|
accessors locals fry ;
|
2007-09-20 18:09:08 -04:00
|
|
|
IN: circular
|
|
|
|
|
2009-12-06 18:20:46 -05:00
|
|
|
TUPLE: circular { seq read-only } { start integer } ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: <circular> ( seq -- circular )
|
2009-12-06 18:20:46 -05:00
|
|
|
0 circular boa ; inline
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-09-15 00:27:37 -04:00
|
|
|
<PRIVATE
|
2009-12-06 18:20:46 -05:00
|
|
|
|
2007-09-20 18:09:08 -04:00
|
|
|
: circular-wrap ( n circular -- n circular )
|
2008-04-13 01:52:49 -04:00
|
|
|
[ start>> + ] keep
|
|
|
|
[ seq>> length rem ] keep ; inline
|
2009-12-06 18:20:46 -05:00
|
|
|
|
2008-09-15 00:27:37 -04:00
|
|
|
PRIVATE>
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2009-12-06 18:20:46 -05:00
|
|
|
M: circular length seq>> length ; inline
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2009-12-06 18:20:46 -05:00
|
|
|
M: circular virtual@ circular-wrap seq>> ; inline
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2009-12-06 18:20:46 -05:00
|
|
|
M: circular virtual-exemplar seq>> ; inline
|
2008-04-13 01:52:49 -04:00
|
|
|
|
2007-09-20 18:09:08 -04:00
|
|
|
: change-circular-start ( n circular -- )
|
|
|
|
#! change start to (start + n) mod length
|
2010-05-05 16:52:54 -04:00
|
|
|
circular-wrap start<< ; inline
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2009-05-13 20:31:58 -04:00
|
|
|
: rotate-circular ( circular -- )
|
2009-12-06 18:20:46 -05:00
|
|
|
[ 1 ] dip change-circular-start ; inline
|
2009-05-13 20:31:58 -04:00
|
|
|
|
2009-12-06 18:20:46 -05:00
|
|
|
: circular-push ( elt circular -- )
|
2009-06-09 19:28:53 -04:00
|
|
|
[ set-first ] [ rotate-circular ] bi ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: <circular-string> ( n -- circular )
|
2009-12-06 18:20:46 -05:00
|
|
|
0 <string> <circular> ; inline
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
INSTANCE: circular virtual-sequence
|
2008-05-25 16:19:26 -04:00
|
|
|
|
2009-12-08 18:05:17 -05:00
|
|
|
TUPLE: growing-circular < circular { length integer } ;
|
2008-05-25 16:19:26 -04:00
|
|
|
|
2009-12-06 18:20:46 -05:00
|
|
|
M: growing-circular length length>> ; inline
|
2008-05-25 16:19:26 -04:00
|
|
|
|
2008-09-15 00:27:37 -04:00
|
|
|
<PRIVATE
|
2009-07-28 12:51:47 -04:00
|
|
|
|
2008-05-25 16:19:26 -04:00
|
|
|
: full? ( circular -- ? )
|
2009-12-06 18:20:46 -05:00
|
|
|
[ length ] [ seq>> length ] bi = ; inline
|
2008-05-25 16:19:26 -04:00
|
|
|
|
2008-09-15 00:27:37 -04:00
|
|
|
PRIVATE>
|
2008-05-25 16:19:26 -04:00
|
|
|
|
2009-12-06 18:20:46 -05:00
|
|
|
: growing-circular-push ( elt circular -- )
|
|
|
|
dup full? [ circular-push ]
|
2009-08-13 20:21:44 -04:00
|
|
|
[ [ 1 + ] change-length set-last ] if ;
|
2008-05-25 16:19:26 -04:00
|
|
|
|
|
|
|
: <growing-circular> ( capacity -- growing-circular )
|
2009-12-06 18:20:46 -05:00
|
|
|
{ } new-sequence 0 0 growing-circular boa ; inline
|
|
|
|
|
|
|
|
TUPLE: circular-iterator
|
|
|
|
{ circular read-only } { n integer } { last-start integer } ;
|
|
|
|
|
2009-12-07 20:27:36 -05:00
|
|
|
: <circular-iterator> ( circular -- obj )
|
|
|
|
0 0 circular-iterator boa ; inline
|
2009-12-06 18:20:46 -05:00
|
|
|
|
|
|
|
<PRIVATE
|
|
|
|
|
2010-03-09 02:38:10 -05:00
|
|
|
: (circular-while) ( ... iterator quot: ( ... obj -- ... ? ) -- ... )
|
2009-12-07 20:27:36 -05:00
|
|
|
[ [ [ n>> ] [ circular>> ] bi nth ] dip call ] 2keep
|
|
|
|
rot [ [ dup n>> >>last-start ] dip ] when
|
|
|
|
over [ n>> ] [ [ last-start>> ] [ circular>> length ] bi + 1 - ] bi = [
|
|
|
|
2drop
|
2009-12-06 18:20:46 -05:00
|
|
|
] [
|
2009-12-07 20:27:36 -05:00
|
|
|
[ [ 1 + ] change-n ] dip (circular-while)
|
2009-12-06 18:20:46 -05:00
|
|
|
] if ; inline recursive
|
|
|
|
|
|
|
|
PRIVATE>
|
|
|
|
|
2010-03-09 02:38:10 -05:00
|
|
|
: circular-while ( ... circular quot: ( ... obj -- ... ? ) -- ... )
|
2009-12-07 20:27:36 -05:00
|
|
|
[ clone ] dip [ <circular-iterator> ] dip (circular-while) ; inline
|