factor/library/collections/sequences.factor

74 lines
2.2 KiB
Factor
Raw Normal View History

2005-04-02 02:39:33 -05:00
! Copyright (C) 2005 Slava Pestov.
! See http://factor.sf.net/license.txt for BSD license.
IN: sequences
2005-05-05 22:30:58 -04:00
USING: errors generic kernel math math-internals strings vectors ;
2005-04-02 02:39:33 -05:00
! This file is needed very early in bootstrap.
! Sequences support the following protocol. Concrete examples
! are strings, string buffers, vectors, and arrays. Arrays are
! low level and no | quot: elt -- ? t bounds-checked; they are in the
2005-04-02 02:39:33 -05:00
! kernel-internals vocabulary, so don't use them unless you have
! a good reason.
GENERIC: empty? ( sequence -- ? )
2005-04-02 02:39:33 -05:00
GENERIC: length ( sequence -- n )
GENERIC: set-length ( n sequence -- )
GENERIC: nth ( n sequence -- obj )
GENERIC: set-nth ( value n sequence -- obj )
GENERIC: thaw ( seq -- mutable-seq )
2005-05-18 16:26:22 -04:00
GENERIC: like ( seq seq -- seq )
GENERIC: reverse ( seq -- seq )
2005-07-17 00:21:10 -04:00
GENERIC: reverse-slice ( seq -- seq )
GENERIC: peek ( seq -- elt )
2005-05-18 16:26:22 -04:00
GENERIC: head ( n seq -- seq )
GENERIC: tail ( n seq -- seq )
GENERIC: concat ( seq -- seq )
2005-06-10 16:08:00 -04:00
GENERIC: resize ( n seq -- seq )
2005-07-16 23:01:51 -04:00
: immutable ( seq quot -- seq | quot: seq -- )
swap [ thaw ] keep >r dup >r swap call r> r> like ; inline
G: each ( seq quot -- | quot: elt -- )
[ over ] [ standard-combination ] ; inline
: each-with ( obj seq quot -- | quot: obj elt -- )
swap [ with ] each 2drop ; inline
: reduce ( seq identity quot -- value | quot: x y -- z )
swapd each ; inline
G: find ( seq quot -- i elt | quot: elt -- ? )
[ over ] [ standard-combination ] ; inline
2005-07-16 22:16:18 -04:00
: find-with ( obj seq quot -- i elt | quot: elt -- ? )
2005-07-16 22:16:18 -04:00
swap [ with rot ] find 2swap 2drop ; inline
: first 0 swap nth ; inline
: second 1 swap nth ; inline
: third 2 swap nth ; inline
: fourth 3 swap nth ; inline
2005-07-16 22:16:18 -04:00
: push ( element sequence -- )
#! Push a value on the end of a sequence.
2005-08-07 00:00:57 -04:00
dup length swap set-nth ; inline
2005-07-16 22:16:18 -04:00
2005-08-02 06:32:48 -04:00
: 2nth ( s s n -- x x ) tuck swap nth >r swap nth r> ; inline
2005-07-16 22:16:18 -04:00
: 2unseq ( { x y } -- x y )
dup first swap second ;
: 3unseq ( { x y z } -- x y z )
dup first over second rot third ;
TUPLE: bounds-error index seq ;
: bounds-error <bounds-error> throw ;
: growable-check ( n seq -- fx seq )
>r >fixnum dup 0 fixnum<
[ r> 2dup bounds-error ] [ r> ] ifte ; inline
: bounds-check ( n seq -- fx seq )
growable-check 2dup length fixnum>=
[ 2dup bounds-error ] when ; inline