 USING: combinators fry io.directories io.directories.hierarchy
-io.directories.search io.files.unique io.pathnames kernel
-namespaces sequences sorting splitting strings system
-tools.test ;
+io.directories.search io.files.unique io.pathnames kernel math
+namespaces sequences sorting splitting splitting.monotonic
+strings tools.test ;
 
 { t } [
     [

    [ drop f ] find-up-to-root
] unit-test

os linux? [
    {
        V{ 1 2 3 2 3 1 2 3 2 3 1 2 3 2 3 }
        V{ 1 1 1 2 2 2 2 2 2 3 3 3 3 3 3 }
    }
] [
    {
        V{
            "/a"
            "/a/a"
            "/a/a/a"
            "/a/b"
            "/a/b/a"
            "/b"
            "/b/a"
            "/b/a/a"
            "/b/b"
            "/b/b/a"
            "/c"
            "/c/a"
            "/c/a/a"
            "/c/b"
            "/c/b/a"
        }
        V{
            "/a"
            "/b"
            "/c"
            "/a/a"
            "/a/b"
            "/b/a"
            "/b/b"
            "/c/a"
            "/c/b"
            "/a/a/a"
            "/a/b/a"
            "/b/a/a"
            "/b/b/a"
            "/c/a/a"
            "/c/b/a"
        }
    }
] if [
    [
        "a" make-directory
        "a/a" make-directory

        +depth-first+ traversal-method [
            "." recursive-directory-files
            current-directory get '[ _ ?head drop ] map

            ! preserve file traversal order, but sort
            ! alphabetically for cross-platform testing
            [ [ length ] bi@ < ] monotonic-split
            [ natural-sort ] map natural-sort concat
        ] with-variable

        +breadth-first+ traversal-method [
            "." recursive-directory-files
            current-directory get '[ _ ?head drop ] map

            ! preserve file traversal order, but sort
            ! alphabetically for cross-platform testing
            [ [ length ] bi@ = ] monotonic-split
            [ natural-sort ] map concat
        ] with-variable
    ] with-test-directory
] unit-test
