! Copyright (C) 2008 Alex Chapman
-! See http;//factorcode.org/license.txt for BSD license
-USING: accessors circular kernel sequences ;
+! Copyright (C) 2012 John Benediktsson
+! See http://factorcode.org/license.txt for BSD license
+USING: accessors circular kernel math sequences ;
IN: sequences.repeating
-TUPLE: repeating circular len ;
+TUPLE: cycles
+{ circular circular read-only }
+{ length integer read-only } ;
-: <repeating> ( seq length -- repeating )
- [ <circular> ] dip repeating boa ;
+: <cycles> ( seq length -- cycles )
+ [ <circular> ] dip cycles boa ;
-: repeated ( seq length -- new-seq )
- dupd <repeating> swap like ;
+: cycle ( seq length -- new-seq )
+ dupd <cycles> swap like ;
-M: repeating length len>> ;
-M: repeating set-length (>>len) ;
+M: cycles length length>> ;
-M: repeating virtual@ ( n seq -- n' seq' ) circular>> ;
+M: cycles set-length length<< ;
-M: repeating virtual-seq circular>> ;
+M: cycles virtual@ circular>> ;
-INSTANCE: repeating virtual-sequence
+M: cycles virtual-exemplar circular>> ;
+
+INSTANCE: cycles virtual-sequence
+
+TUPLE: repeats
+{ seq sequence read-only }
+{ times integer read-only } ;
+
+C: <repeats> repeats
+
+M: repeats length [ seq>> length ] [ times>> ] bi * ;
+
+M: repeats virtual@ [ times>> /i ] [ seq>> ] bi ;
+
+M: repeats virtual-exemplar seq>> ;
+
+INSTANCE: repeats immutable-sequence
+
+INSTANCE: repeats virtual-sequence
+
+: repeat ( seq times -- new-seq )
+ dupd <repeats> swap like ;