Groups and clumps
Factor handbook > The language > Collections > Sequence operations

Prev:Splitting sequences
Next:Destructive sequence operations


Splitting a sequence into disjoint, fixed-length subsequences:
group ( seq n -- array )


A virtual sequence for splitting a sequence into disjoint, fixed-length subsequences:
groups

<groups> ( seq n -- groups )


Splitting a sequence into overlapping, fixed-length subsequences:
clump ( seq n -- array )


Splitting a sequence into overlapping, fixed-length subsequences, wrapping around the end of the sequence:
circular-clump ( seq n -- array )


A virtual sequence for splitting a sequence into overlapping, fixed-length subsequences:
clumps

<clumps> ( seq n -- clumps )


A virtual sequence for splitting a sequence into overlapping, fixed-length subsequences, wrapping around the end of the sequence:
circular-clumps

<circular-clumps> ( seq n -- clumps )


The difference can be summarized as the following:
With groups, the subsequences form the original sequence when concatenated:
USING: grouping ; { 1 2 3 4 } 2 group .
{ { 1 2 } { 3 4 } }

USING: grouping ; { 1 2 3 4 } dup 2 <groups> concat sequence= .
t
With clumps, collecting the first element of each subsequence but the last one, together with the last subsequence, yields the original sequence:
USING: grouping ; { 1 2 3 4 } 2 clump .
{ { 1 2 } { 2 3 } { 3 4 } }

USING: grouping assocs sequences ; { 1 2 3 4 } dup 2 <clumps> unclip-last [ keys ] dip append sequence= .
t
With circular clumps, collecting the first element of each subsequence yields the original sequence. Collecting the nth element of each subsequence would rotate the original sequence n elements rightward:
USING: grouping ; { 1 2 3 4 } 2 circular-clump .
{ { 1 2 } { 2 3 } { 3 4 } { 4 1 } }

USING: grouping assocs sequences ; { 1 2 3 4 } dup 2 <circular-clumps> keys sequence= .
t

USING: grouping ; { 1 2 3 4 } 2 <circular-clumps> [ second ] { } map-as .
{ 2 3 4 1 }


A combinator built using clumps:
monotonic? ( seq quot: ( elt1 elt2 -- ? ) -- ? )


Testing how elements are related:
all-eq? ( seq -- ? )

all-equal? ( seq -- ? )