1 ! Copyright (C) 2008 Alex Chapman
2 ! Copyright (C) 2012 John Benediktsson
3 ! Copyright (C) 2023 nomennescio
4 ! See https://factorcode.org/license.txt for BSD license
5 USING: accessors circular kernel math sequences ;
6 IN: sequences.repeating
9 { circular circular read-only }
10 { length integer read-only } ;
12 : <cycles> ( seq length -- cycles )
13 [ <circular> ] dip cycles boa ;
15 : cycle ( seq length -- new-seq )
16 dupd <cycles> swap like ;
18 : repeat ( seq times -- new-seq )
21 M: cycles length length>> ;
23 M: cycles set-length length<< ;
25 M: cycles virtual@ circular>> ;
27 M: cycles virtual-exemplar circular>> ;
29 INSTANCE: cycles virtual-sequence
33 : full-cycle? ( cycle -- ? ) [ length>> ] [ circular>> length ] bi >= ; inline
37 M: cycles minimum dup full-cycle? [ circular>> minimum ] [ (minimum) ] if ; inline
38 M: cycles maximum dup full-cycle? [ circular>> maximum ] [ (maximum) ] if ; inline
40 TUPLE: element-repeats < sequence-view
41 { times integer read-only } ;
43 C: <element-repeats> element-repeats
45 M: element-repeats length [ seq>> length ] [ times>> ] bi * ;
47 M: element-repeats virtual@ [ times>> /i ] [ seq>> ] bi ;
49 INSTANCE: element-repeats immutable-sequence
51 : repeat-elements ( seq times -- new-seq )
52 dupd <element-repeats> swap like ;