! Copyright (C) 2008, 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
-USING: accessors arrays combinators hints kernel locals math
-math.order sequences sequences.private ;
+USING: arrays combinators kernel math math.order sequences
+sequences.private vectors ;
IN: binary-search
<PRIVATE
midpoint@ midpoint
] [
midpoint quot call {
- { +eq+ [ midpoint@ midpoint ] }
{ +lt+ [ seq from midpoint@ quot (search) ] }
{ +gt+ [ seq midpoint@ to quot (search) ] }
+ { +eq+ [ midpoint@ midpoint ] }
} case
] if ; inline recursive
PRIVATE>
: search ( seq quot: ( elt -- <=> ) -- i elt )
- over empty? [ 2drop f f ] [ [ 0 over length ] dip (search) ] if ;
- inline
-
-: natural-search ( obj seq -- i elt )
- [ <=> ] with search ;
+ over empty? [ 2drop f f ] [ [ 0 over length ] dip (search) ] if ; inline
-HINTS: natural-search array ;
+GENERIC: natural-search ( obj seq -- i elt )
+M: object natural-search [ <=> ] with search ;
+M: array natural-search [ <=> ] with search ;
+M: vector natural-search [ <=> ] with search ;
: sorted-index ( obj seq -- i )
natural-search drop ;