diff --git a/extra/math/transforms/bwt/bwt-tests.factor b/extra/math/transforms/bwt/bwt-tests.factor index 9491bf644e..0a02db2d65 100644 --- a/extra/math/transforms/bwt/bwt-tests.factor +++ b/extra/math/transforms/bwt/bwt-tests.factor @@ -1,6 +1,8 @@ ! Copyright (C) 2012 John Benediktsson ! See http://factorcode.org/license.txt for BSD license -USING: tools.test ; +USING: kernel tools.test ; IN: math.transforms.bwt { "asdf" } [ "asdf" bwt ibwt ] unit-test + +{ t } [ "hello" [ bwt nip ] [ bwt* ] bi = ] unit-test diff --git a/extra/math/transforms/bwt/bwt.factor b/extra/math/transforms/bwt/bwt.factor index 35844580e5..d3cecea39c 100644 --- a/extra/math/transforms/bwt/bwt.factor +++ b/extra/math/transforms/bwt/bwt.factor @@ -1,10 +1,17 @@ ! Copyright (C) 2012 John Benediktsson ! See http://factorcode.org/license.txt for BSD license -USING: assocs fry kernel sequences sequences.rotated sorting ; +USING: accessors assocs fry kernel math sequences +sequences.rotated sorting suffix-arrays.private ; IN: math.transforms.bwt ! Semi-efficient versions of Burrows-Wheeler Transform +: bwt* ( seq -- newseq ) + [ + dup suffixes natural-sort + [ dup from>> [ to>> ] [ nip ] if-zero 1 - over nth ] + ] [ map-as ] bi nip ; + : bwt ( seq -- i newseq ) dup all-rotations natural-sort [ [ sequence= ] with find drop ]