     seq length 1 - :> m!
     [ l m < ]
     [
-        k seq nth x!
+        k seq nth-unsafe x!
         l i!
         m j!
         [ i j <= ]

        j k < [ i l! ] when
        k i < [ j m! ] when
    ] while
    k seq nth ; inline

: (kth-object) ( seq k nth-quot exchange-quot quot: ( x y -- ? ) -- elt )
    #! The algorithm modifiers seq, so we clone it
    [ clone ] 4dip ((kth-object)) ; inline

: kth-object-unsafe ( seq k quot: ( x y -- ? ) -- elt )
    [ [ nth-unsafe ] [ exchange-unsafe ] ] dip (kth-object) ; inline

: kth-objects-unsafe ( seq kths quot: ( x y -- ? ) -- elts )
    [ clone ] 2dip
    '[ [ nth-unsafe ] [ exchange-unsafe ]  _ ((kth-object)) ] with map ; inline

PRIVATE>


    [ [ nth ] [ exchange ] ] dip (kth-object) ; inline

: kth-objects ( seq kths quot: ( x y -- ? ) -- elts )
    '[ _ kth-object ] with map ; inline

: kth-smallests ( seq kths -- elts ) [ < ] kth-objects-unsafe ;

