! Copyright (C) 2012 John Benediktsson
! See http://factorcode.org/license.txt for BSD license
-USING: arrays fry kernel math sequences sequences.extras
+USING: accessors assocs kernel sequences sequences.rotated
sorting ;
IN: math.transforms.bwt
-! Inefficient versions of Burrows-Wheeler Transform
+! Semi-efficient versions of Burrows-Wheeler Transform
-: bwt ( seq -- newseq )
- 0 suffix all-rotations natural-sort [ last ] map ;
+:: bwt ( seq -- i newseq )
+ seq all-rotations natural-sort
+ [ [ n>> 0 = ] find drop ] keep
+ [ last ] seq map-as ;
-: ibwt ( newseq -- seq )
- [ length [ { } <array> ] keep ] keep
- '[ _ [ prefix ] 2map natural-sort ] times
- [ { 0 } tail? ] find nip but-last ;
+: ibwt ( i newseq -- seq )
+ [ length ]
+ [ <enumerated> sort-values '[ _ nth first2 ] ]
+ [ replicate-as ] tri nip ;