]> gitweb.factorcode.org Git - factor.git/blob - basis/deques/deques.factor
8ecde83a14a2081c81b2a2d657353e0c826849d7
[factor.git] / basis / deques / deques.factor
1 ! Copyright (C) 2008, 2010 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: fry kernel sequences ;
4 IN: deques
5
6 GENERIC: push-front* ( obj deque -- node )
7 GENERIC: push-back* ( obj deque -- node )
8 GENERIC: peek-front* ( deque -- obj ? )
9 GENERIC: peek-back* ( deque -- obj ? )
10 GENERIC: pop-front* ( deque -- )
11 GENERIC: pop-back* ( deque -- )
12 GENERIC: delete-node ( node deque -- )
13 GENERIC: deque-member? ( value deque -- ? )
14 GENERIC: clear-deque ( deque -- )
15 GENERIC: node-value ( node -- value )
16 GENERIC: deque-empty? ( deque -- ? )
17
18 ERROR: empty-deque ;
19
20 : peek-front ( deque -- obj )
21     peek-front* [ drop empty-deque ] unless ;
22
23 : ?peek-front ( deque -- obj/f )
24     peek-front* [ drop f ] unless ;
25
26 : peek-back ( deque -- obj )
27     peek-back* [ drop empty-deque ] unless ;
28
29 : ?peek-back ( deque -- obj/f )
30     peek-back* [ drop f ] unless ;
31
32 : push-front ( obj deque -- )
33     push-front* drop ; inline
34
35 : push-all-front ( seq deque -- )
36     '[ _ push-front ] each ;
37
38 : push-back ( obj deque -- )
39     push-back* drop ; inline
40
41 : push-all-back ( seq deque -- )
42     '[ _ push-back ] each ;
43
44 : pop-front ( deque -- obj )
45     [ peek-front ] [ pop-front* ] bi ; inline
46
47 : pop-back ( deque -- obj )
48     [ peek-back ] [ pop-back* ] bi ; inline
49
50 : slurp-deque ( ... deque quot: ( ... obj -- ... ) -- ... )
51     [ drop '[ _ deque-empty? ] ]
52     [ '[ _ pop-back @ ] ]
53     2bi until ; inline
54
55 MIXIN: deque