factor/library/collections/sequences-epilogue.factor

173 lines
4.2 KiB
Factor
Raw Normal View History

2006-01-09 01:34:23 -05:00
! Copyright (C) 2005, 2006 Slava Pestov.
2005-12-31 20:51:58 -05:00
! See http://factorcode.org/license.txt for BSD license.
2005-04-02 02:39:33 -05:00
IN: sequences
USING: arrays errors generic kernel kernel-internals math
2006-01-09 01:34:23 -05:00
sequences-internals strings vectors words ;
2005-04-02 02:39:33 -05:00
2006-08-16 21:55:53 -04:00
: first2 ( seq -- first second )
1 swap bounds-check nip first2-unsafe ;
2006-08-16 21:55:53 -04:00
: first3 ( seq -- first second third )
2 swap bounds-check nip first3-unsafe ;
2006-08-16 21:55:53 -04:00
: first4 ( seq -- first second third fourth )
3 swap bounds-check nip first4-unsafe ;
2005-07-16 22:16:18 -04:00
M: object like drop ;
2006-08-16 21:55:53 -04:00
: index ( obj seq -- n )
[ = ] find-with drop ;
2006-03-27 22:20:42 -05:00
2006-08-16 21:55:53 -04:00
: index* ( obj i seq -- n )
[ = ] find-with* drop ;
2006-03-27 22:20:42 -05:00
2006-08-16 21:55:53 -04:00
: last-index ( obj seq -- n )
[ = ] find-last-with drop ;
2006-03-27 22:20:42 -05:00
2006-08-16 21:55:53 -04:00
: last-index* ( obj i seq -- n )
[ = ] find-last-with* drop ;
2006-03-27 22:20:42 -05:00
: member? ( obj seq -- ? )
[ = ] contains-with? ;
2006-03-27 22:20:42 -05:00
2006-08-16 21:55:53 -04:00
: memq? ( obj seq -- ? )
[ eq? ] contains-with? ;
2006-03-27 22:20:42 -05:00
: remove ( obj seq -- newseq )
[ = not ] subset-with ;
2005-04-06 21:41:49 -04:00
2005-09-17 04:15:05 -04:00
: (subst) ( newseq oldseq elt -- new/elt )
[ swap index ] keep
2005-09-24 15:21:17 -04:00
over -1 > [ drop swap nth ] [ 2nip ] if ;
2005-09-17 04:15:05 -04:00
: subst ( newseq oldseq seq -- )
[ >r 2dup r> (subst) ] inject 2drop ;
2006-08-16 21:55:53 -04:00
: move ( m n seq -- )
2005-09-14 00:37:50 -04:00
pick pick number=
2005-09-24 15:21:17 -04:00
[ 3drop ] [ [ nth swap ] keep set-nth ] if ; inline
2005-09-14 00:37:50 -04:00
2006-08-15 04:57:12 -04:00
: (delete) ( elt store scan seq -- elt store scan seq )
2005-09-14 00:37:50 -04:00
2dup length < [
3dup move
2006-07-28 03:54:46 -04:00
[ nth pick = ] 2keep rot
2005-09-16 22:47:28 -04:00
[ >r >r 1+ r> r> ] unless >r 1+ r> (delete)
2005-09-14 00:37:50 -04:00
] when ;
: delete ( elt seq -- ) 0 0 rot (delete) nip set-length drop ;
2005-09-14 00:37:50 -04:00
2006-05-25 23:45:19 -04:00
: push-new ( elt seq -- ) [ delete ] 2keep push ;
2006-08-16 21:55:53 -04:00
: prune ( seq -- newseq )
2006-06-20 23:26:41 -04:00
[ V{ } clone swap [ over push-new ] each ] keep like ;
2006-08-16 21:55:53 -04:00
: nappend ( dest src -- )
2006-01-02 00:51:03 -05:00
>r [ length ] keep r> copy-into ; inline
2006-08-16 21:55:53 -04:00
: >resizable ( seq -- newseq ) [ thaw dup ] keep nappend ;
2005-04-06 21:41:49 -04:00
2006-08-16 21:55:53 -04:00
: immutable ( seq quot -- newseq )
2006-01-02 00:51:03 -05:00
swap [ >resizable [ swap call ] keep ] keep like ; inline
2005-12-31 20:51:58 -05:00
2006-08-16 21:55:53 -04:00
: append ( seq1 seq2 -- newseq )
swap [ swap nappend ] immutable ;
2006-08-16 21:55:53 -04:00
: add ( seq elt -- newseq )
swap [ push ] immutable ;
2005-04-17 21:59:11 -04:00
2006-08-16 21:55:53 -04:00
: add* ( seq elt -- newseq )
over >r
over thaw [ push ] keep [ swap nappend ] keep
r> like ;
2006-08-16 21:55:53 -04:00
: diff ( seq1 seq2 -- newseq )
[ swap member? not ] subset-with ;
2005-12-04 22:06:12 -05:00
2006-08-16 21:55:53 -04:00
: append3 ( seq1 seq2 seq3 -- newseq )
rot [ [ rot nappend ] keep swap nappend ] immutable ;
2005-04-17 21:59:11 -04:00
2006-08-16 21:55:53 -04:00
: peek ( seq -- elt ) dup length 1- swap nth ;
2005-04-06 21:41:49 -04:00
2006-08-16 21:55:53 -04:00
: pop* ( seq -- ) dup length 1- swap set-length ;
2005-09-14 00:37:50 -04:00
2006-08-17 23:15:36 -04:00
: pop ( seq -- elt )
dup length 1- swap [ nth ] 2keep set-length ;
2005-04-06 21:41:49 -04:00
2005-09-18 01:37:28 -04:00
: all-equal? ( seq -- ? ) [ = ] monotonic? ;
: all-eq? ( seq -- ? ) [ eq? ] monotonic? ;
2006-07-28 03:54:46 -04:00
: (mismatch) ( seq1 seq2 n -- i )
[ >r 2dup r> 2nth-unsafe = not ] find drop 2nip ; inline
2005-10-09 21:27:14 -04:00
: mismatch ( seq1 seq2 -- i )
2006-07-28 03:54:46 -04:00
2dup min-length (mismatch) ;
2005-10-09 21:27:14 -04:00
2006-08-16 21:55:53 -04:00
: flip ( matrix -- newmatrix )
2005-07-31 23:38:33 -04:00
dup empty? [
dup first [ length ] keep like
[ swap [ nth ] map-with ] map-with
] unless ;
2006-08-16 21:55:53 -04:00
: unpair ( assoc -- keys values )
flip dup empty? [ drop { } { } ] [ first2 ] if ;
2006-08-16 21:55:53 -04:00
: exchange ( m n seq -- )
2006-03-14 16:51:09 -05:00
pick over bounds-check 2drop 2dup bounds-check 2drop
exchange-unsafe ;
: assoc ( key assoc -- value )
[ first = ] find-with nip second ;
2006-05-20 16:42:33 -04:00
: rassoc ( value assoc -- key )
[ second = ] find-with nip first ;
: last/first ( seq -- pair ) dup peek swap first 2array ;
: padding ( seq n elt -- newseq )
>r swap length [-] r> <array> ;
: pad-left ( seq n elt -- padded )
pick >r pick >r padding r> append r> like ;
: pad-right ( seq n elt -- padded )
pick >r padding r> swap append ;
2006-08-16 21:55:53 -04:00
: sequence= ( seq1 seq2 -- ? )
2006-07-28 03:54:46 -04:00
2dup [ length ] 2apply tuck number=
2006-08-07 15:41:31 -04:00
[ (mismatch) -1 number= ] [ 3drop f ] if ; inline
M: array equal?
2006-08-07 15:41:31 -04:00
over array? [ sequence= ] [ 2drop f ] if ;
M: quotation equal?
2006-08-07 15:41:31 -04:00
over quotation? [ sequence= ] [ 2drop f ] if ;
M: sbuf equal?
2006-08-07 15:41:31 -04:00
over sbuf? [ sequence= ] [ 2drop f ] if ;
M: vector equal?
2006-08-07 15:41:31 -04:00
over vector? [ sequence= ] [ 2drop f ] if ;
UNION: sequence array string sbuf vector quotation ;
M: sequence hashcode
2006-06-23 02:24:28 -04:00
dup empty? [ drop 0 ] [ first hashcode ] if ;
2005-04-06 21:41:49 -04:00
IN: kernel
2006-01-09 01:34:23 -05:00
M: object <=>
2dup mismatch dup -1 =
[ drop [ length ] 2apply - ] [ 2nth-unsafe <=> ] if ;
2005-12-31 20:51:58 -05:00
: depth ( -- n ) datastack length ;
2005-08-08 15:21:14 -04:00
2006-08-01 04:45:05 -04:00
TUPLE: no-cond ;
: no-cond ( -- * ) <no-cond> throw ;
2006-08-16 21:55:53 -04:00
: cond ( assoc -- )
2006-06-04 03:46:06 -04:00
[ first call ] find nip dup [ second call ] [ no-cond ] if ;
2005-08-08 15:21:14 -04:00
2006-08-16 21:55:53 -04:00
: unix? ( -- ? )
os { "freebsd" "linux" "macosx" "solaris" } member? ;