1 ! Copyright (C) 2008 Alex Chapman
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors arrays kernel locals math sequences
9 GENERIC: modified-nth ( n seq -- elt )
11 M: modified nth modified-nth ;
12 M: modified nth-unsafe modified-nth ;
14 GENERIC: modified-set-nth ( elt n seq -- )
16 M: modified set-nth modified-set-nth ;
17 M: modified set-nth-unsafe modified-set-nth ;
19 INSTANCE: modified virtual-sequence
21 TUPLE: 1modified < modified seq ;
23 M: 1modified length seq>> length ;
24 M: 1modified set-length seq>> set-length ;
25 M: 1modified virtual-exemplar seq>> ;
27 TUPLE: scaled < 1modified c ;
31 : scale ( seq c -- new-seq )
32 dupd <scaled> swap like ;
34 M: scaled modified-nth
35 [ seq>> nth ] [ c>> * ] bi ;
37 M: scaled modified-set-nth
39 [ nip c>> / ] [ seq>> set-nth ] 2bi ;
41 TUPLE: offset < 1modified n ;
45 : seq-offset ( seq n -- new-seq )
46 dupd <offset> swap like ;
48 M: offset modified-nth
49 [ seq>> nth ] [ n>> + ] bi ;
51 M: offset modified-set-nth
52 [ nip n>> - ] [ seq>> set-nth ] 2bi ;
54 TUPLE: summed < modified seqs ;
58 M: summed length seqs>> longest length ;
60 M: summed modified-nth
61 seqs>> [ ?nth [ + ] when* ] with 0 swap reduce ;
63 M: summed modified-set-nth immutable ;
66 seqs>> [ set-length ] with each ;
68 M: summed virtual-exemplar
71 : <2summed> ( seq seq -- summed-seq ) 2array <summed> ;
73 : <3summed> ( seq seq seq -- summed-seq ) 3array <summed> ;