2019-10-18 09:05:06 -04:00
|
|
|
! Copyright (C) 2005, 2007 Slava Pestov.
|
2006-11-03 16:17:27 -05:00
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2019-10-18 09:05:06 -04:00
|
|
|
IN: sequences-internals
|
|
|
|
|
USING: generic kernel math namespaces strings vectors errors
|
|
|
|
|
sequences ;
|
2005-06-23 23:29:04 -04:00
|
|
|
|
2019-10-18 09:05:06 -04:00
|
|
|
: (start) ( subseq seq n -- subseq seq ? )
|
|
|
|
|
pick length [
|
|
|
|
|
>r 3dup r> [ + swap nth-unsafe ] keep rot nth-unsafe =
|
|
|
|
|
] all? nip ; inline
|
2005-06-23 23:29:04 -04:00
|
|
|
|
2019-10-18 09:05:06 -04:00
|
|
|
: (head) 0 swap rot ; inline
|
|
|
|
|
: (tail) over length rot ; inline
|
|
|
|
|
: from-end >r dup length r> - ; inline
|
2005-08-07 18:11:20 -04:00
|
|
|
|
2019-10-18 09:05:06 -04:00
|
|
|
IN: sequences
|
2005-06-23 23:29:04 -04:00
|
|
|
|
2019-10-18 09:05:06 -04:00
|
|
|
: head-slice ( seq n -- slice ) (head) <slice> ;
|
|
|
|
|
: tail-slice ( seq n -- slice ) (tail) <slice> ;
|
|
|
|
|
: head-slice* ( seq n -- slice ) from-end head-slice ;
|
|
|
|
|
: tail-slice* ( seq n -- slice ) from-end tail-slice ;
|
|
|
|
|
: head ( seq n -- headseq ) (head) subseq ;
|
|
|
|
|
: tail ( seq n -- tailseq ) (tail) subseq ;
|
|
|
|
|
: head* ( seq n -- headseq ) from-end head ;
|
|
|
|
|
: tail* ( seq n -- tailseq ) from-end tail ;
|
2005-08-25 15:27:38 -04:00
|
|
|
|
2005-06-23 23:29:04 -04:00
|
|
|
: head? ( seq begin -- ? )
|
2005-09-16 02:39:33 -04:00
|
|
|
2dup [ length ] 2apply < [
|
2005-06-23 23:29:04 -04:00
|
|
|
2drop f
|
|
|
|
|
] [
|
2006-07-29 20:36:25 -04:00
|
|
|
[ length head-slice ] keep sequence=
|
2006-06-05 23:26:44 -04:00
|
|
|
] if ;
|
2005-06-23 23:29:04 -04:00
|
|
|
|
2006-08-16 21:55:53 -04:00
|
|
|
: ?head ( seq begin -- newseq ? )
|
2006-07-29 20:36:25 -04:00
|
|
|
2dup head? [ length tail t ] [ drop f ] if ;
|
2005-06-23 23:29:04 -04:00
|
|
|
|
2006-08-17 23:15:36 -04:00
|
|
|
: tail? ( seq end -- ? )
|
2005-09-16 02:39:33 -04:00
|
|
|
2dup [ length ] 2apply < [
|
2005-06-23 23:29:04 -04:00
|
|
|
2drop f
|
|
|
|
|
] [
|
2006-07-29 20:36:25 -04:00
|
|
|
[ length tail-slice* ] keep sequence=
|
2006-06-05 23:26:44 -04:00
|
|
|
] if ;
|
2005-06-23 23:29:04 -04:00
|
|
|
|
2006-08-16 21:55:53 -04:00
|
|
|
: ?tail ( seq end -- newseq ? )
|
2006-07-29 20:36:25 -04:00
|
|
|
2dup tail? [ length head* t ] [ drop f ] if ;
|
2005-06-23 23:29:04 -04:00
|
|
|
|
2006-08-16 21:55:53 -04:00
|
|
|
: replace-slice ( new m n seq -- replaced )
|
2019-10-18 09:05:04 -04:00
|
|
|
tuck swap tail-slice >r swap head-slice swap r> 3append ;
|
2005-10-01 01:44:49 -04:00
|
|
|
|
2006-08-16 21:55:53 -04:00
|
|
|
: remove-nth ( n seq -- newseq )
|
2006-07-29 20:36:25 -04:00
|
|
|
>r f swap dup 1+ r> replace-slice ;
|
2006-05-19 21:08:42 -04:00
|
|
|
|
2019-10-18 09:05:06 -04:00
|
|
|
: cut-slice ( n seq -- before after )
|
2006-07-29 20:36:25 -04:00
|
|
|
swap [ head ] 2keep tail-slice ;
|
2005-12-31 20:51:58 -05:00
|
|
|
|
|
|
|
|
: cut ( n seq -- before after )
|
2006-07-29 20:36:25 -04:00
|
|
|
swap [ head ] 2keep tail ;
|
2005-12-31 20:51:58 -05:00
|
|
|
|
2006-07-29 20:36:25 -04:00
|
|
|
: cut* ( n seq -- before after )
|
|
|
|
|
swap [ head* ] 2keep tail* ;
|
2006-03-08 15:03:01 -05:00
|
|
|
|
2019-10-18 09:05:06 -04:00
|
|
|
: start* ( subseq seq n -- i )
|
|
|
|
|
pick length pick length swap - 1+
|
|
|
|
|
[ (start) ] find*
|
|
|
|
|
swap >r 3drop r> ;
|
2005-06-23 23:29:04 -04:00
|
|
|
|
2019-10-18 09:05:06 -04:00
|
|
|
: start ( subseq seq -- i ) 0 start* ; inline
|
2005-06-23 23:29:04 -04:00
|
|
|
|
2006-06-05 23:26:44 -04:00
|
|
|
: subseq? ( subseq seq -- ? ) start -1 > ;
|
2005-06-23 23:29:04 -04:00
|
|
|
|
2019-10-18 09:05:06 -04:00
|
|
|
: split1-slice ( seq subseq -- before after )
|
2005-06-23 23:29:04 -04:00
|
|
|
dup pick start dup -1 = [
|
2005-08-29 01:57:21 -04:00
|
|
|
2drop dup like f
|
2005-06-23 23:29:04 -04:00
|
|
|
] [
|
2019-10-18 09:05:06 -04:00
|
|
|
[ >r over r> head -rot length ] keep + tail-slice
|
2006-06-05 23:26:44 -04:00
|
|
|
] if ;
|
2005-06-23 23:29:04 -04:00
|
|
|
|
2019-10-18 09:05:06 -04:00
|
|
|
: split1 ( seq subseq -- before after )
|
|
|
|
|
over >r split1-slice dup [ r> like ] [ r> drop ] if ;
|
|
|
|
|
|
2006-07-29 20:36:25 -04:00
|
|
|
: split, building get peek push ;
|
2006-06-11 22:44:22 -04:00
|
|
|
|
|
|
|
|
: split-next, V{ } clone , ;
|
|
|
|
|
|
2006-08-16 21:55:53 -04:00
|
|
|
: (split) ( quot elt -- )
|
2019-10-18 09:05:06 -04:00
|
|
|
swap keep swap
|
2006-07-29 20:36:25 -04:00
|
|
|
[ drop split-next, ] [ split, ] if ; inline
|
2005-06-23 23:29:04 -04:00
|
|
|
|
2006-08-16 21:55:53 -04:00
|
|
|
: split* ( seq quot -- pieces )
|
2006-06-11 22:44:22 -04:00
|
|
|
over >r
|
2006-06-14 02:27:57 -04:00
|
|
|
[ split-next, swap [ (split) ] each-with ]
|
2006-06-11 22:44:22 -04:00
|
|
|
{ } make r> swap [ swap like ] map-with ; inline
|
2005-06-23 23:29:04 -04:00
|
|
|
|
2006-08-16 21:55:53 -04:00
|
|
|
: split ( seq separators -- pieces )
|
2006-06-11 22:44:22 -04:00
|
|
|
swap [ over member? ] split* nip ;
|
2005-09-01 01:20:43 -04:00
|
|
|
|
2006-08-16 21:55:53 -04:00
|
|
|
: drop-prefix ( seq1 seq2 -- slice1 slice2 )
|
2005-10-09 21:27:14 -04:00
|
|
|
2dup mismatch dup -1 = [ drop 2dup min-length ] when
|
2006-07-29 20:36:25 -04:00
|
|
|
tuck tail-slice >r tail-slice r> ;
|
2005-10-25 21:52:26 -04:00
|
|
|
|
2006-07-29 20:36:25 -04:00
|
|
|
: unclip ( seq -- rest first ) dup 1 tail swap first ;
|