factor/extra/sorting/extras/extras.factor

38 lines
1.2 KiB
Factor
Raw Normal View History

USING: arrays assocs kernel kernel.private locals math
math.order sequences sequences.extras sequences.private sorting ;
2012-08-06 13:59:40 -04:00
IN: sorting.extras
: argsort ( seq quot: ( obj1 obj2 -- <=> ) -- sortedseq )
2014-11-08 03:46:30 -05:00
[ zip-index ] dip
2012-08-06 13:59:40 -04:00
[ [ first-unsafe ] bi@ ] prepose
2012-09-19 13:23:58 -04:00
sort [ second-unsafe ] map! ; inline
: map-sort ( ... seq quot: ( ... elt -- ... key ) -- ... sortedseq )
2014-12-05 13:50:32 -05:00
[ keep ] curry { } map>assoc
2013-07-24 13:24:13 -04:00
[ { array } declare first-unsafe ] sort-with
[ { array } declare second-unsafe ] map ; inline
:: bisect-left ( obj seq -- i )
0 seq length [ 2dup < ] [
2dup + 2/ dup seq nth-unsafe obj before?
[ swap [ nip 1 + ] dip ] [ nip ] if
] while drop ;
:: bisect-right ( obj seq -- i )
0 seq length [ 2dup < ] [
2dup + 2/ dup seq nth-unsafe obj after?
[ nip ] [ swap [ nip 1 + ] dip ] if
] while drop ;
: insort-left ( obj seq -- seq' )
[ bisect-left ] 2keep swapd insert-nth ;
: insort-right ( obj seq -- seq' )
[ bisect-right ] 2keep swapd insert-nth ;
: insort-left! ( obj seq -- seq )
[ bisect-left ] 2keep swapd [ insert-nth! ] keep ;
: insort-right! ( obj seq -- seq )
[ bisect-right ] 2keep swapd [ insert-nth! ] keep ;