1 ! Copyright (C) 2005, 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: kernel math math.order strings arrays vectors sequences
7 TUPLE: abstract-groups seq n ;
9 : check-groups dup 0 <= [ "Invalid group count" throw ] when ; inline
11 : new-groups ( seq n class -- groups )
12 >r check-groups r> boa ; inline
14 GENERIC: group@ ( n groups -- from to seq )
16 M: abstract-groups nth group@ subseq ;
18 M: abstract-groups set-nth group@ <slice> 0 swap copy ;
20 M: abstract-groups like drop { } like ;
22 INSTANCE: abstract-groups sequence
24 TUPLE: groups < abstract-groups ;
26 : <groups> ( seq n -- groups )
27 groups new-groups ; inline
30 [ seq>> length ] [ n>> ] bi [ + 1- ] keep /i ;
33 [ n>> * ] [ seq>> ] bi set-length ;
36 [ n>> [ * dup ] keep + ] [ seq>> ] bi [ length min ] keep ;
38 TUPLE: sliced-groups < groups ;
40 : <sliced-groups> ( seq n -- groups )
41 sliced-groups new-groups ; inline
43 M: sliced-groups nth group@ <slice> ;
45 TUPLE: clumps < abstract-groups ;
47 : <clumps> ( seq n -- clumps )
48 clumps new-groups ; inline
51 [ seq>> length ] [ n>> ] bi - 1+ ;
54 [ n>> + 1- ] [ seq>> ] bi set-length ;
57 [ n>> over + ] [ seq>> ] bi ;
59 TUPLE: sliced-clumps < groups ;
61 : <sliced-clumps> ( seq n -- clumps )
62 sliced-clumps new-groups ; inline
64 M: sliced-clumps nth group@ <slice> ;
66 : group ( seq n -- array ) <groups> { } like ;
68 : clump ( seq n -- array ) <clumps> { } like ;