Groups and clumps - Factor Documentation (original) (raw)

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
( 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
( seq n -- clumps )

A virtual sequence for splitting a sequence into overlapping, fixed-length subsequences, wrapping around the end of the sequence:
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 prettyprint ; { 1 2 3 4 } 2 group .{ { 1 2 } { 3 4 } }USING: grouping prettyprint sequences ; { 1 2 3 4 } dup 2 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 prettyprint ; { 1 2 3 4 } 2 clump .{ { 1 2 } { 2 3 } { 3 4 } }USING: grouping assocs sequences prettyprint ; { 1 2 3 4 } dup 2 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 prettyprint ; { 1 2 3 4 } 2 circular-clump .{ { 1 2 } { 2 3 } { 3 4 } { 4 1 } }USING: grouping assocs sequences prettyprint ; { 1 2 3 4 } dup 2 keys sequence= .tUSING: grouping prettyprint ; { 1 2 3 4 } 2 [ 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 -- ? )