1 ! Copyright (C) 2011 John Benediktsson.
2 ! See http://factorcode.org/license.txt for BSD license.
4 USING: ascii combinators combinators.short-circuit kernel
11 : carry ( elt last first -- ? elt' )
12 '[ _ > dup _ ] keep ? ;
14 : next-digit ( ch -- ? ch' )
15 1 + CHAR: 9 CHAR: 0 carry ;
17 : next-letter ( ch -- ? ch' )
18 [ ch>lower 1 + CHAR: z CHAR: a carry ] [ LETTER? ] bi
21 : next-char ( ch -- ? ch' )
23 { [ dup digit? ] [ next-digit ] }
24 { [ dup Letter? ] [ next-letter ] }
28 : map-until ( seq quot: ( elt -- ? elt' ) -- seq' ? )
29 [ t 0 pick length '[ 2dup _ < and ] ] dip '[
30 nip [ over _ change-nth ] keep 1 +
33 : alphanum? ( ch -- ? )
34 { [ Letter? ] [ digit? ] } 1|| ;
38 : successor ( str -- str' )
40 dup [ alphanum? ] any? [
41 reverse [ next-char ] map-until
42 [ dup last suffix ] when reverse
44 dup length 1 - over [ 1 + ] change-nth