better error reporting for push/pop on dlists

db4
Doug Coleman 2008-05-25 20:43:17 -05:00
parent 191e95d8c1
commit 91aa69dda6
2 changed files with 16 additions and 7 deletions

View File

@ -98,5 +98,7 @@ IN: dlists.tests
[ t ] [ <dlist> 4 over push-back 5 over push-back* [ = ] curry dlist-find-node drop class dlist-node = ] unit-test [ t ] [ <dlist> 4 over push-back 5 over push-back* [ = ] curry dlist-find-node drop class dlist-node = ] unit-test
[ ] [ <dlist> 4 over push-back 5 over push-back [ drop ] dlist-each ] unit-test [ ] [ <dlist> 4 over push-back 5 over push-back [ drop ] dlist-each ] unit-test
[ f ] [ <dlist> peek-front ] unit-test [ <dlist> peek-front ] must-fail
[ f ] [ <dlist> peek-back ] unit-test [ <dlist> peek-back ] must-fail
[ <dlist> pop-front ] [ empty-dlist? ] must-fail-with
[ <dlist> pop-back ] [ empty-dlist? ] must-fail-with

View File

@ -1,7 +1,7 @@
! Copyright (C) 2007, 2008 Mackenzie Straight, Doug Coleman, ! Copyright (C) 2007, 2008 Mackenzie Straight, Doug Coleman,
! Slava Pestov. ! Slava Pestov.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: combinators kernel math sequences accessors ; USING: combinators kernel math sequences accessors inspector ;
IN: dlists IN: dlists
TUPLE: dlist front back length ; TUPLE: dlist front back length ;
@ -84,11 +84,17 @@ PRIVATE>
: push-all-back ( seq dlist -- ) : push-all-back ( seq dlist -- )
[ push-back ] curry each ; [ push-back ] curry each ;
ERROR: empty-dlist ;
M: empty-dlist summary ( dlist -- )
drop "Emtpy dlist" ;
: peek-front ( dlist -- obj ) : peek-front ( dlist -- obj )
front>> dup [ obj>> ] when ; front>> [ empty-dlist ] unless* obj>> ;
: pop-front ( dlist -- obj ) : pop-front ( dlist -- obj )
dup front>> [ dup front>> [ empty-dlist ] unless*
[
dup next>> dup next>>
f rot (>>next) f rot (>>next)
f over set-prev-when f over set-prev-when
@ -100,10 +106,11 @@ PRIVATE>
pop-front drop ; pop-front drop ;
: peek-back ( dlist -- obj ) : peek-back ( dlist -- obj )
back>> dup [ obj>> ] when ; back>> [ empty-dlist ] unless* obj>> ;
: pop-back ( dlist -- obj ) : pop-back ( dlist -- obj )
dup back>> [ dup back>> [ empty-dlist ] unless*
[
dup prev>> dup prev>>
f rot (>>prev) f rot (>>prev)
f over set-next-when f over set-next-when