{ { 1 2 3 1 2 } } [ { 1 2 3 } 5 cycle ] unit-test
{ { 1 2 3 1 2 3 1 2 3 } } [ { 1 2 3 } 9 cycle ] unit-test
+{ { } } [ { 1 2 3 } 0 repeat-elements ] unit-test
+{ { 1 2 3 } } [ { 1 2 3 } 1 repeat-elements ] unit-test
+{ { 1 1 2 2 3 3 } } [ { 1 2 3 } 2 repeat-elements ] unit-test
+{ { 1 1 1 2 2 2 3 3 3 } } [ { 1 2 3 } 3 repeat-elements ] unit-test
+{ { 1 1 1 1 2 2 2 2 3 3 3 3 } } [ { 1 2 3 } 4 repeat-elements ] unit-test
+
{ { } } [ { 1 2 3 } 0 repeat ] unit-test
{ { 1 2 3 } } [ { 1 2 3 } 1 repeat ] unit-test
-{ { 1 1 2 2 3 3 } } [ { 1 2 3 } 2 repeat ] unit-test
-{ { 1 1 1 2 2 2 3 3 3 } } [ { 1 2 3 } 3 repeat ] unit-test
-{ { 1 1 1 1 2 2 2 2 3 3 3 3 } } [ { 1 2 3 } 4 repeat ] unit-test
+{ { 1 2 3 1 2 3 } } [ { 1 2 3 } 2 repeat ] unit-test
+{ { 1 2 3 1 2 3 1 2 3 } } [ { 1 2 3 } 3 repeat ] unit-test
+{ { 1 2 3 1 2 3 1 2 3 1 2 3 } } [ { 1 2 3 } 4 repeat ] unit-test
+
: cycle ( seq length -- new-seq )
dupd <cycles> swap like ;
+: repeat ( seq times -- new-seq )
+ over length * cycle ;
+
M: cycles length length>> ;
M: cycles set-length length<< ;
INSTANCE: cycles virtual-sequence
-TUPLE: repeats
+TUPLE: element-repeats
{ seq sequence read-only }
{ times integer read-only } ;
-C: <repeats> repeats
+C: <element-repeats> element-repeats
-M: repeats length [ seq>> length ] [ times>> ] bi * ;
+M: element-repeats length [ seq>> length ] [ times>> ] bi * ;
-M: repeats virtual@ [ times>> /i ] [ seq>> ] bi ;
+M: element-repeats virtual@ [ times>> /i ] [ seq>> ] bi ;
-M: repeats virtual-exemplar seq>> ;
+M: element-repeats virtual-exemplar seq>> ;
-INSTANCE: repeats immutable-sequence
+INSTANCE: element-repeats immutable-sequence
-INSTANCE: repeats virtual-sequence
+INSTANCE: element-repeats virtual-sequence
-: repeat ( seq times -- new-seq )
- dupd <repeats> swap like ;
+: repeat-elements ( seq times -- new-seq )
+ dupd <element-repeats> swap like ;