2010-09-21 00:37:54 -04:00
|
|
|
! Copyright (C) 2008, 2010 Doug Coleman, Slava Pestov.
|
2008-09-12 16:49:46 -04:00
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2010-09-21 00:37:54 -04:00
|
|
|
USING: accessors fry kernel make math math.order math.parser
|
|
|
|
sequences sorting.functor strings unicode.case
|
2010-09-21 01:03:03 -04:00
|
|
|
unicode.categories unicode.collation ;
|
2008-09-12 16:49:46 -04:00
|
|
|
IN: sorting.human
|
|
|
|
|
2010-09-21 12:17:39 -04:00
|
|
|
: cut-find ( sequence pred -- before after )
|
2010-09-21 00:37:54 -04:00
|
|
|
[ drop ] [ find drop ] 2bi dup [ cut ] when ; inline
|
|
|
|
|
2010-09-21 12:17:39 -04:00
|
|
|
: cut3 ( sequence pred -- first mid last )
|
2010-09-21 00:37:54 -04:00
|
|
|
[ cut-find ] keep [ not ] compose cut-find ; inline
|
|
|
|
|
2010-09-21 12:17:39 -04:00
|
|
|
: find-sequences ( sequence pred quot -- sequences )
|
2010-09-21 00:37:54 -04:00
|
|
|
'[
|
|
|
|
[
|
|
|
|
_ cut3 [
|
|
|
|
[ , ]
|
|
|
|
[ [ @ , ] when* ] bi*
|
|
|
|
] dip dup
|
|
|
|
] loop drop
|
|
|
|
] { } make ; inline
|
|
|
|
|
2010-09-21 12:17:39 -04:00
|
|
|
: find-numbers ( sequence -- sequence' )
|
2010-09-21 00:37:54 -04:00
|
|
|
[ digit? ] [ string>number ] find-sequences ;
|
2008-09-12 16:49:46 -04:00
|
|
|
|
2009-05-26 11:05:55 -04:00
|
|
|
! For comparing integers or sequences
|
2011-10-02 12:24:51 -04:00
|
|
|
TUPLE: alphanum obj ;
|
2009-05-26 11:05:55 -04:00
|
|
|
|
2011-10-02 14:59:38 -04:00
|
|
|
: <alphanum> ( obj -- alphanum )
|
2011-10-02 12:24:51 -04:00
|
|
|
alphanum new
|
2010-09-21 00:37:54 -04:00
|
|
|
swap >>obj ; inline
|
|
|
|
|
2011-10-02 14:59:38 -04:00
|
|
|
: <alphanum-insensitive> ( obj -- alphanum )
|
2011-10-02 12:24:51 -04:00
|
|
|
alphanum new
|
2010-09-21 01:03:03 -04:00
|
|
|
swap dup string? [ w/collation-key ] when >>obj ; inline
|
2010-09-21 00:37:54 -04:00
|
|
|
|
2011-10-02 12:24:51 -04:00
|
|
|
M: alphanum <=>
|
2009-05-26 11:05:55 -04:00
|
|
|
[ obj>> ] bi@
|
|
|
|
2dup [ integer? ] bi@ xor [
|
2010-09-21 00:37:54 -04:00
|
|
|
drop integer? +lt+ +gt+ ?
|
2009-05-26 11:05:55 -04:00
|
|
|
] [
|
|
|
|
<=>
|
|
|
|
] if ;
|
|
|
|
|
2011-10-02 12:24:51 -04:00
|
|
|
<< "human" [ find-numbers [ <alphanum> ] map ] define-sorting >>
|
|
|
|
<< "humani" [ find-numbers [ <alphanum-insensitive> ] map ] define-sorting >>
|