diff --git a/basis/tools/completion/completion-tests.factor b/basis/tools/completion/completion-tests.factor
index 39a7bc8b62..ad37c290a7 100644
--- a/basis/tools/completion/completion-tests.factor
+++ b/basis/tools/completion/completion-tests.factor
@@ -1,13 +1,11 @@
-
-USING: assocs kernel tools.completion tools.completion.private
-tools.test ;
+USING: arrays assocs kernel sequences tools.test ;
 
 IN: tools.completion
 
 { f } [ "abc" "def" fuzzy ] unit-test
 { V{ 4 5 6 } } [ "set-nth" "nth" fuzzy ] unit-test
 
-{ V{ V{ 0 } V{ 4 5 6 } } } [ V{ 0 4 5 6 } runs ] unit-test
+{ { { 0 } { 4 5 6 } } } [ V{ 0 4 5 6 } runs [ >array ] map ] unit-test
 
 { { "nth" "?nth" "set-nth" } } [
     "nth" { "set-nth" "nth" "?nth" } dup zip completions keys
diff --git a/basis/tools/completion/completion.factor b/basis/tools/completion/completion.factor
index 58bf1d4156..8c53878ae3 100644
--- a/basis/tools/completion/completion.factor
+++ b/basis/tools/completion/completion.factor
@@ -2,10 +2,10 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors arrays assocs colors.constants combinators
 combinators.short-circuit fry io.directories io.files
-io.files.info io.files.types io.pathnames kernel locals make
-math math.order sequences sequences.private sorting splitting
-unicode.categories unicode.data vectors vocabs vocabs.hierarchy
-;
+io.files.info io.pathnames kernel locals make math math.order
+sequences sequences.private sorting splitting
+splitting.monotonic unicode.categories unicode.data vectors
+vocabs vocabs.hierarchy ;
 IN: tools.completion
 
 <PRIVATE
@@ -28,21 +28,8 @@ PRIVATE>
     dup [ length <vector> 0 ] curry 2dip
     [ (fuzzy) ] with all? 2drop ;
 
-<PRIVATE
-
-: (runs) ( runs n seq -- runs n )
-    [
-        [
-            2dup number=
-            [ drop ] [ nip V{ } clone pick push ] if
-            1 +
-        ] keep pick last push
-    ] each ; inline
-
-PRIVATE>
-
 : runs ( seq -- newseq )
-    [ V{ } clone 1vector ] dip [ first ] keep (runs) drop ;
+    [ 1 - = ] monotonic-split-slice ;
 
 <PRIVATE
 
@@ -69,15 +56,12 @@ PRIVATE>
     ] if ;
 
 : rank-completions ( results -- newresults )
-    sort-keys <reversed>
     [ 0 [ first max ] reduce 3 /f ] keep
     [ first-unsafe < ] with filter
-    values ;
+    sort-keys <reversed> values ;
 
 : complete ( full short -- score )
-    [ dupd fuzzy score ] 2keep
-    [ <reversed> ] bi@
-    dupd fuzzy score max ;
+    2dup [ <reversed> ] bi@ [ dupd fuzzy score ] 2bi@ max ;
 
 : completion ( short candidate -- result )
     [ second swap complete ] keep 2array ; inline