packages feed

text-compression 0.1.0.24 → 0.1.0.25

raw patch · 4 files changed

+153/−210 lines, 4 filesPVP: major bump suggested

API removals or changes: PVP suggests a major version bump

API changes (from Hackage documentation)

- Data.FMIndex: bytestringToFMIndexB :: BWTMatrix ByteString -> Seq (Maybe ByteString) -> FMIndexB
- Data.FMIndex: bytestringToFMIndexT :: BWTMatrix ByteString -> Seq (Maybe ByteString) -> FMIndexT
- Data.FMIndex: textToFMIndexB :: BWTMatrix Text -> Seq (Maybe Text) -> FMIndexB
- Data.FMIndex: textToFMIndexT :: BWTMatrix Text -> Seq (Maybe Text) -> FMIndexT
+ Data.FMIndex.Internal: SAB :: SuffixArray ByteString -> SAB
+ Data.FMIndex.Internal: SAT :: SuffixArray Text -> SAT
+ Data.FMIndex.Internal: instance GHC.Classes.Eq Data.FMIndex.Internal.SAB
+ Data.FMIndex.Internal: instance GHC.Classes.Eq Data.FMIndex.Internal.SAT
+ Data.FMIndex.Internal: instance GHC.Classes.Ord Data.FMIndex.Internal.SAB
+ Data.FMIndex.Internal: instance GHC.Classes.Ord Data.FMIndex.Internal.SAT
+ Data.FMIndex.Internal: instance GHC.Generics.Generic Data.FMIndex.Internal.SAB
+ Data.FMIndex.Internal: instance GHC.Generics.Generic Data.FMIndex.Internal.SAT
+ Data.FMIndex.Internal: instance GHC.Read.Read Data.FMIndex.Internal.SAB
+ Data.FMIndex.Internal: instance GHC.Read.Read Data.FMIndex.Internal.SAT
+ Data.FMIndex.Internal: instance GHC.Show.Show Data.FMIndex.Internal.SAB
+ Data.FMIndex.Internal: instance GHC.Show.Show Data.FMIndex.Internal.SAT
+ Data.FMIndex.Internal: newtype SAB
+ Data.FMIndex.Internal: newtype SAT
- Data.FMIndex.Internal: FMIndexB :: (CcB, OccCKB) -> FMIndexB
+ Data.FMIndex.Internal: FMIndexB :: (CcB, OccCKB, SAB) -> FMIndexB
- Data.FMIndex.Internal: FMIndexT :: (CcT, OccCKT) -> FMIndexT
+ Data.FMIndex.Internal: FMIndexT :: (CcT, OccCKT, SAT) -> FMIndexT

Files

CHANGELOG.md view
@@ -100,3 +100,7 @@ ## 0.1.0.24 -- 2022-12-08  * Optimized parallel implementation for locate and count FM-index functions.++## 0.1.0.25 -- 2022-12-09++* Optimized FMIndexB and FMIndexT data types to include the SuffixArray of the respective input.
src/Data/FMIndex.hs view
@@ -21,14 +21,6 @@ -- To do this, users can use the 'bytestringToBWTToFMIndexB' and 'bytestringToBWTToFMIndexT' functions, -- as well as the 'textToBWTToFMIndexB' and 'textToBWTToFMIndexT' functions. ----- The base functions for 'ByteString', 'bytestringToFMIndexB' and 'bytestringToFMIndexT' can be used to--- convert a 'Seq' ('Maybe' 'ByteString') to a 'FMIndexB' and 'FMIndexT', respectively.------ Likewise, the base functions for 'Text', 'textToFMIndexB' and 'textToFMIndexT' can be used to--- convert a 'Seq' ('Maybe' 'Text') to a 'FMIndexB' and 'FMIndexT' respectively.------ There are various other lower-level functions for interacting with the FMIndex implementation on 'ByteString' and 'Text' as well.--- -- = Operation: Count -- -- The count operation is supported by both sequential, 'bytestringFMIndexCountS' and 'textFMIndexCountS'@@ -60,11 +52,7 @@                       textBWTToFMIndexB,                       bytestringBWTToFMIndexB,                       textBWTToFMIndexT,-                      bytestringBWTToFMIndexT,-                      textToFMIndexB,-                      bytestringToFMIndexB,-                      textToFMIndexT,-                      bytestringToFMIndexT,+                      bytestringBWTToFMIndexT,                           -- * From FMIndex functions                       bytestringFromBWTFromFMIndexB,                       bytestringFromBWTFromFMIndexT,@@ -147,11 +135,16 @@ textBWTToFMIndexB :: BWTMatrix Word8                   -> TextBWT                   -> FMIndexB-textBWTToFMIndexB (BWTMatrix DS.Empty) _  = FMIndexB (CcB DS.Empty,OccCKB DS.Empty)+textBWTToFMIndexB (BWTMatrix DS.Empty) _  = FMIndexB (CcB DS.Empty,OccCKB DS.Empty,SAB DS.Empty) textBWTToFMIndexB bwm                  xs = do   let occckb = CMST.runST $ seqToOccCKB xss   let ccb    = CMST.runST $ seqToCcB bwmff-  FMIndexB (CcB ccb,OccCKB occckb)+  let sab    = createSuffixArray     $+               fmap (BSC8.singleton) $+               DS.fromList           $+               DText.unpack          $+               textFromBWT xs+  FMIndexB (CcB ccb,OccCKB occckb,SAB sab)     where       bwmf  = fmap (\x -> case viewl x of                             EmptyL       -> Nothing@@ -180,11 +173,16 @@ bytestringBWTToFMIndexB :: BWTMatrix Word8                         -> BWT Word8                         -> FMIndexB-bytestringBWTToFMIndexB (BWTMatrix DS.Empty) _  = FMIndexB (CcB DS.Empty,OccCKB DS.Empty) +bytestringBWTToFMIndexB (BWTMatrix DS.Empty) _  = FMIndexB (CcB DS.Empty,OccCKB DS.Empty,SAB DS.Empty)  bytestringBWTToFMIndexB bwm                  xs = do   let occckb = CMST.runST $ seqToOccCKB xss-  let ccb    = CMST.runST $ seqToCcB bwmff -  FMIndexB (CcB ccb,OccCKB occckb)+  let ccb    = CMST.runST $ seqToCcB bwmff+  let sab    = createSuffixArray   $+               fmap (BS.singleton) $+               DS.fromList         $+               BS.unpack           $+               bytestringFromWord8BWT xs+  FMIndexB (CcB ccb,OccCKB occckb,SAB sab)     where       bwmf  = fmap (\x -> case viewl x of                             EmptyL       -> Nothing@@ -212,11 +210,16 @@ textBWTToFMIndexT :: BWTMatrix Word8                   -> TextBWT                   -> FMIndexT-textBWTToFMIndexT (BWTMatrix DS.Empty) _  = FMIndexT (CcT DS.Empty,OccCKT DS.Empty)+textBWTToFMIndexT (BWTMatrix DS.Empty) _  = FMIndexT (CcT DS.Empty,OccCKT DS.Empty,SAT DS.Empty) textBWTToFMIndexT bwm                  xs = do   let occckt = CMST.runST $ seqToOccCKT xss   let cct    = CMST.runST $ seqToCcT bwmff-  FMIndexT (CcT cct,OccCKT occckt)+  let sat    = createSuffixArray      $+               fmap (DText.singleton) $+               DS.fromList            $+               DText.unpack           $+               textFromBWT xs +  FMIndexT (CcT cct,OccCKT occckt,SAT sat)     where       bwmf  = fmap (\x -> case viewl x of                             EmptyL       -> Nothing@@ -247,11 +250,17 @@ bytestringBWTToFMIndexT :: BWTMatrix Word8                         -> BWT Word8                         -> FMIndexT-bytestringBWTToFMIndexT (BWTMatrix DS.Empty) _  = FMIndexT (CcT DS.Empty,OccCKT DS.Empty)+bytestringBWTToFMIndexT (BWTMatrix DS.Empty) _  = FMIndexT (CcT DS.Empty,OccCKT DS.Empty,SAT DS.Empty) bytestringBWTToFMIndexT bwm                  xs = do   let occckt = CMST.runST $ seqToOccCKT xss   let cct    = CMST.runST $ seqToCcT bwmff-  FMIndexT (CcT cct,OccCKT occckt)+  let sat    = createSuffixArray $+               fmap (DText.singleton) $+               DS.fromList            $+               DText.unpack           $+               DTE.decodeUtf8         $+               bytestringFromWord8BWT xs+  FMIndexT (CcT cct,OccCKT occckt,SAT sat)     where       bwmf  = fmap (\x -> case viewl x of                             EmptyL       -> Nothing@@ -276,104 +285,6 @@                  )             ((\(BWT t) -> t) xs) --- | Takes a 'Text' and returns the FM-index ('FMIndexB').-textToFMIndexB :: BWTMatrix Text-               -> Seq (Maybe Text)-               -> FMIndexB-textToFMIndexB (BWTMatrix DS.Empty) _        = FMIndexB (CcB DS.Empty,OccCKB DS.Empty) -textToFMIndexB _                    DS.Empty = FMIndexB (CcB DS.Empty,OccCKB DS.Empty)-textToFMIndexB bwm                  xs       = do-  let occckb = CMST.runST $ seqToOccCKB xss-  let ccb    = CMST.runST $ seqToCcB bwmff-  FMIndexB (CcB ccb,OccCKB occckb)-    where-      bwmf  = fmap (\x -> case viewl x of-                            EmptyL       -> Nothing-                            (xh DS.:< _) -> xh-                   ) $-              (\(BWTMatrix m) -> m) bwm-      bwmff = fmap (\x -> if | isNothing x-                             -> Nothing-                             | otherwise-                             -> Just           $-                                DTE.encodeUtf8 $-                                fromJust x-                   ) bwmf-      xss   = fmap (\x -> if | isNothing x-                             -> Nothing-                             | otherwise-                             -> Just           $-                                DTE.encodeUtf8 $-                                fromJust x-                   )-              xs---- | Takes a 'Seq' of 'ByteString's and returns the FM-index ('FMIndexB').-bytestringToFMIndexB :: BWTMatrix ByteString-                     -> Seq (Maybe ByteString)-                     -> FMIndexB-bytestringToFMIndexB (BWTMatrix DS.Empty) _        = FMIndexB (CcB DS.Empty,OccCKB DS.Empty)-bytestringToFMIndexB _                    DS.Empty = FMIndexB (CcB DS.Empty,OccCKB DS.Empty)-bytestringToFMIndexB bwm                  xs       = do-  let occckb = CMST.runST $ seqToOccCKB xs-  let ccb    = CMST.runST $ seqToCcB bwmf-  FMIndexB (CcB ccb,OccCKB occckb)-    where-      bwmf  = fmap (\x -> case viewl x of-                            EmptyL       -> Nothing-                            (xh DS.:< _) -> xh-                   ) $-              (\(BWTMatrix m) -> m) bwm---- | Takes a 'Text' and returns the FM-index ('FMIndexT').-textToFMIndexT :: BWTMatrix Text-               -> Seq (Maybe Text)-               -> FMIndexT-textToFMIndexT (BWTMatrix DS.Empty) _        = FMIndexT (CcT DS.Empty,OccCKT DS.Empty)-textToFMIndexT _                    DS.Empty = FMIndexT (CcT DS.Empty,OccCKT DS.Empty) -textToFMIndexT bwm                  xs       = do-  let occckt = CMST.runST $ seqToOccCKT xs-  let cct    = CMST.runST $ seqToCcT bwmf-  FMIndexT (CcT cct,OccCKT occckt)-    where-      bwmf  = fmap (\x -> case viewl x of-                            EmptyL       -> Nothing-                            (xh DS.:< _) -> xh-                   ) $-              (\(BWTMatrix m) -> m) bwm---- | Takes a 'ByteString' and returns the FM-index ('FMIndexT').-bytestringToFMIndexT :: BWTMatrix ByteString-                     -> Seq (Maybe ByteString)-                     -> FMIndexT-bytestringToFMIndexT (BWTMatrix DS.Empty) _        = FMIndexT (CcT DS.Empty,OccCKT DS.Empty) -bytestringToFMIndexT _                    DS.Empty = FMIndexT (CcT DS.Empty,OccCKT DS.Empty) -bytestringToFMIndexT bwm                  xs       = do-  let occckt = CMST.runST $ seqToOccCKT xss-  let cct    = CMST.runST $ seqToCcT bwmff-  FMIndexT (CcT cct,OccCKT occckt)-    where-      bwmf  = fmap (\x -> case viewl x of-                            EmptyL       -> Nothing-                            (xh DS.:< _) -> xh-                   ) $-              (\(BWTMatrix m) -> m) bwm-      bwmff = fmap (\x -> if | isNothing x-                             -> Nothing-                             | otherwise-                             -> Just           $-                                DTE.decodeUtf8 $ -                                fromJust x-                   ) bwmf-      xss = fmap (\x -> if | isNothing x-                           -> Nothing-                           | otherwise-                           -> Just           $-                              DTE.decodeUtf8 $-                              fromJust x-                 )-            xs- {-----------------------}  @@ -390,16 +301,16 @@ bytestringFromBWTFromFMIndexT :: FMIndexT                               -> ByteString bytestringFromBWTFromFMIndexT xs = bytestringFromByteStringBWT $-                               BWT                         $-                               fmap (\x -> if | isNothing x-                                              -> Nothing-                                              | otherwise-                                              -> Just           $-                                                 DTE.encodeUtf8 $-                                                 fromJust x-                                    )+                                   BWT                             $+                                   fmap (\x -> if | isNothing x+                                                  -> Nothing+                                                  | otherwise+                                                  -> Just           $+                                                     DTE.encodeUtf8 $+                                                     fromJust x+                                        )                                                            $-                            ((\(BWT t) -> t) (textBWTFromFMIndexT xs))+                                   ((\(BWT t) -> t) (textBWTFromFMIndexT xs))  -- | Helper function for converting a 'BWT'ed 'FMIndexB' -- back to the original 'Text'.@@ -417,18 +328,20 @@ -- the 'BWT' of 'Text's. textBWTFromFMIndexT :: FMIndexT                     -> BWT Text-textBWTFromFMIndexT (FMIndexT (CcT DS.Empty,_))    = BWT DS.Empty-textBWTFromFMIndexT (FMIndexT (_,OccCKT DS.Empty)) = BWT DS.Empty-textBWTFromFMIndexT xs                             =+textBWTFromFMIndexT (FMIndexT (CcT DS.Empty,_,_))    = BWT DS.Empty+textBWTFromFMIndexT (FMIndexT (_,OccCKT DS.Empty,_)) = BWT DS.Empty+textBWTFromFMIndexT (FMIndexT (_,_,SAT DS.Empty))    = BWT DS.Empty+textBWTFromFMIndexT xs                               =   BWT (seqFromFMIndexT xs)  -- | Takes a 'FMIndexT' and returns -- the 'BWT' of 'ByteString's. bytestringBWTFromFMIndexT :: FMIndexT                           -> BWT ByteString-bytestringBWTFromFMIndexT (FMIndexT (CcT DS.Empty,_))    = BWT DS.Empty-bytestringBWTFromFMIndexT (FMIndexT (_,OccCKT DS.Empty)) = BWT DS.Empty -bytestringBWTFromFMIndexT xs                             = do+bytestringBWTFromFMIndexT (FMIndexT (CcT DS.Empty,_,_))    = BWT DS.Empty+bytestringBWTFromFMIndexT (FMIndexT (_,OccCKT DS.Empty,_)) = BWT DS.Empty+bytestringBWTFromFMIndexT (FMIndexT (_,_,SAT DS.Empty))    = BWT DS.Empty+bytestringBWTFromFMIndexT xs                               = do   let originalbwtb = seqFromFMIndexT xs   BWT (fmap (\x -> if | isNothing x                       -> Nothing@@ -442,9 +355,10 @@ -- the 'BWT' of 'Text's. textBWTFromFMIndexB :: FMIndexB                     -> BWT Text-textBWTFromFMIndexB (FMIndexB (CcB DS.Empty,_))    = BWT DS.Empty-textBWTFromFMIndexB (FMIndexB (_,OccCKB DS.Empty)) = BWT DS.Empty-textBWTFromFMIndexB xs                             = do+textBWTFromFMIndexB (FMIndexB (CcB DS.Empty,_,_))    = BWT DS.Empty+textBWTFromFMIndexB (FMIndexB (_,OccCKB DS.Empty,_)) = BWT DS.Empty+textBWTFromFMIndexB (FMIndexB (_,_,SAB DS.Empty))    = BWT DS.Empty+textBWTFromFMIndexB xs                               = do   let originalbwtt = seqFromFMIndexB xs   BWT (fmap (\x -> if | isNothing x                       -> Nothing@@ -458,18 +372,20 @@ -- the 'BWT' of 'ByteString's. bytestringBWTFromFMIndexB :: FMIndexB                           -> BWT ByteString-bytestringBWTFromFMIndexB (FMIndexB (CcB DS.Empty,_))    = BWT DS.Empty-bytestringBWTFromFMIndexB (FMIndexB (_,OccCKB DS.Empty)) = BWT DS.Empty -bytestringBWTFromFMIndexB xs                             =+bytestringBWTFromFMIndexB (FMIndexB (CcB DS.Empty,_,_))    = BWT DS.Empty+bytestringBWTFromFMIndexB (FMIndexB (_,OccCKB DS.Empty,_)) = BWT DS.Empty+bytestringBWTFromFMIndexB (FMIndexB (_,_,SAB DS.Empty))    = BWT DS.Empty+bytestringBWTFromFMIndexB xs                               =   BWT (seqFromFMIndexB xs)  -- | Takes a 'FMIndexB' and returns -- the original 'Seq' of 'Text's. textFromFMIndexB :: FMIndexB                  -> Seq (Maybe Text)-textFromFMIndexB (FMIndexB (CcB DS.Empty,_))    = DS.Empty-textFromFMIndexB (FMIndexB (_,OccCKB DS.Empty)) = DS.Empty-textFromFMIndexB xs                             = do+textFromFMIndexB (FMIndexB (CcB DS.Empty,_,_))    = DS.Empty+textFromFMIndexB (FMIndexB (_,OccCKB DS.Empty,_)) = DS.Empty+textFromFMIndexB (FMIndexB (_,_,SAB DS.Empty))    = DS.Empty+textFromFMIndexB xs                               = do   let originalt = seqFromFMIndexB xs   fmap (\x -> if | isNothing x                  -> Nothing@@ -483,27 +399,30 @@ -- the original 'Seq' of 'ByteString's. bytestringFromFMIndexB :: FMIndexB                        -> Seq (Maybe ByteString)-bytestringFromFMIndexB (FMIndexB (CcB DS.Empty,_))    = DS.Empty-bytestringFromFMIndexB (FMIndexB (_,OccCKB DS.Empty)) = DS.Empty -bytestringFromFMIndexB xs                             =+bytestringFromFMIndexB (FMIndexB (CcB DS.Empty,_,_))    = DS.Empty+bytestringFromFMIndexB (FMIndexB (_,OccCKB DS.Empty,_)) = DS.Empty+bytestringFromFMIndexB (FMIndexB (_,_,SAB DS.Empty))    = DS.Empty+bytestringFromFMIndexB xs                               =   seqFromFMIndexB xs  -- | Takes a 'FMIndexT' and returns -- the original 'Seq' of 'Text's. textFromFMIndexT :: FMIndexT                  -> Seq (Maybe Text)-textFromFMIndexT (FMIndexT (CcT DS.Empty,_))    = DS.Empty-textFromFMIndexT (FMIndexT (_,OccCKT DS.Empty)) = DS.Empty-textFromFMIndexT xs                             =+textFromFMIndexT (FMIndexT (CcT DS.Empty,_,_))    = DS.Empty+textFromFMIndexT (FMIndexT (_,OccCKT DS.Empty,_)) = DS.Empty+textFromFMIndexT (FMIndexT (_,_,SAT DS.Empty))    = DS.Empty+textFromFMIndexT xs                               =   seqFromFMIndexT xs  -- | Takes a 'FMIndexT' and returns -- the original 'Seq' of 'ByteString's. bytestringFromFMIndexT :: FMIndexT                        -> Seq (Maybe ByteString)-bytestringFromFMIndexT (FMIndexT (CcT DS.Empty,_))    = DS.Empty-bytestringFromFMIndexT (FMIndexT (_,OccCKT DS.Empty)) = DS.Empty-bytestringFromFMIndexT xs                             = do+bytestringFromFMIndexT (FMIndexT (CcT DS.Empty,_,_))    = DS.Empty+bytestringFromFMIndexT (FMIndexT (_,OccCKT DS.Empty,_)) = DS.Empty+bytestringFromFMIndexT (FMIndexT (_,_,SAT DS.Empty))    = DS.Empty+bytestringFromFMIndexT xs                               = do   let originalb = seqFromFMIndexT xs   fmap (\x -> if | isNothing x                  -> Nothing@@ -580,7 +499,9 @@   numcores <- CC.getNumCapabilities   let chunksize = (P.length allpats) `div` numcores   let bfmindex  = bytestringToBWTToFMIndexB input-  let bcount    = (iBFMC allpats bfmindex) `CPS.using` (CPS.parListChunk chunksize CPS.rseq)+  let bcount    = (iBFMC allpats bfmindex)+                  `CPS.using`+                  (CPS.parListChunk chunksize CPS.rseq)   return $ DS.fromList bcount     where       iBFMC []                      _    = []@@ -608,7 +529,9 @@   numcores <- CC.getNumCapabilities    let chunksize = (P.length allpats) `div` numcores   let tfmindex  = textToBWTToFMIndexT input-  let tcount    = (iTFMC allpats tfmindex) `CPS.using` (CPS.parListChunk chunksize CPS.rseq)+  let tcount    = (iTFMC allpats tfmindex)+                  `CPS.using`+                  (CPS.parListChunk chunksize CPS.rseq)   return $ DS.fromList tcount     where       iTFMC []                      _    = []@@ -637,11 +560,10 @@ bytestringFMIndexLocateS []      _                        = DS.Empty bytestringFMIndexLocateS _       (BSC8.uncons -> Nothing) = DS.Empty bytestringFMIndexLocateS allpats input                    = do-  let bytestringsa = createSuffixArray   $-                     fmap (BS.singleton) $-                     DS.fromList         $ -                     BS.unpack input   let bfmindex     = bytestringToBWTToFMIndexB input+  let bytestringsa = (\(SAB t) -> t) $+                     (\(_,_,c) -> c) $+                     (\(FMIndexB t) -> t) bfmindex   iBFML allpats         bytestringsa         bfmindex@@ -674,11 +596,10 @@ textFMIndexLocateS []      _     = DS.Empty textFMIndexLocateS _       ""    = DS.Empty textFMIndexLocateS allpats input = do-  let textsa      = createSuffixArray      $-                    fmap (DText.singleton) $-                    DS.fromList            $-                    DText.unpack input   let tfmindex    = textToBWTToFMIndexT input+  let textsa      = (\(SAT t) -> t) $+                    (\(_,_,c) -> c) $+                    (\(FMIndexT t) -> t) tfmindex   iTFML allpats         textsa         tfmindex@@ -716,12 +637,13 @@ bytestringFMIndexLocateP allpats input                    = do   numcores <- CC.getNumCapabilities   let chunksize    = (P.length allpats) `div` numcores-  let bytestringsa = createSuffixArray   $-                     fmap (BS.singleton) $-                     DS.fromList         $ -                     BS.unpack input   let bfmindex     = bytestringToBWTToFMIndexB input-  let blocate      = (iBFML allpats bytestringsa bfmindex) `CPS.using` (CPS.parListChunk chunksize CPS.rseq)+  let bytestringsa = (\(SAB t) -> t) $+                     (\(_,_,c) -> c) $+                     (\(FMIndexB t) -> t) bfmindex+  let blocate      = (iBFML allpats bytestringsa bfmindex)+                     `CPS.using`+                     (CPS.parListChunk chunksize CPS.rseq)   return $ DS.fromList blocate     where       iBFML []                      _   _    = []@@ -757,12 +679,13 @@ textFMIndexLocateP allpats input = do   numcores <- CC.getNumCapabilities   let chunksize = (P.length allpats) `div` numcores-  let textsa    = createSuffixArray      $-                  fmap (DText.singleton) $-                  DS.fromList            $-                  DText.unpack input   let tfmindex  = textToBWTToFMIndexT input-  let tlocate   = (iTFML allpats textsa tfmindex) `CPS.using` (CPS.parListChunk chunksize CPS.rseq)+  let textsa    = (\(SAT t) -> t) $+                  (\(_,_,c) -> c) $+                  (\(FMIndexT t) -> t) tfmindex+  let tlocate   = (iTFML allpats textsa tfmindex)+                  `CPS.using`+                  (CPS.parListChunk chunksize CPS.rseq)   return $ DS.fromList tlocate     where       iTFML []                      _   _    = []
src/Data/FMIndex/Internal.hs view
@@ -125,6 +125,8 @@                                CcT(..),                                CB(..),                                CT(..),+                               SAB(..),+                               SAT(..),                                -- * To OccCK (ByteString) functions                                PBOccCKSeqB,                                OccCKSeqB,@@ -251,7 +253,7 @@                                locateFMIndexT                              ) where -import Data.BWT.Internal()+import Data.BWT.Internal (SuffixArray) import Data.MTF.Internal  import Control.Monad as CM@@ -274,11 +276,11 @@ {-Base level types.-}  -- | Basic FMIndex ('ByteString') data type.-newtype FMIndexB = FMIndexB (CcB,OccCKB)+newtype FMIndexB = FMIndexB (CcB,OccCKB,SAB)   deriving (Eq,Ord,Show,Read,Generic)  -- | Basic FMIndex ('Text') data type.-newtype FMIndexT = FMIndexT (CcT,OccCKT)+newtype FMIndexT = FMIndexT (CcT,OccCKT,SAT)   deriving (Eq,Ord,Show,Read,Generic)  -- | Basic OccCKB ('ByteString') data type.@@ -305,6 +307,14 @@ newtype CT = CT (Maybe Int)   deriving (Eq,Ord,Show,Read,Generic) +-- | Basic 'SuffixArray' ('ByteString') data type.+newtype SAB = SAB (SuffixArray ByteString)+  deriving (Eq,Ord,Show,Read,Generic)++-- | Basic 'SuffixArray' ('Text') data type.+newtype SAT = SAT (SuffixArray Text)+  deriving (Eq,Ord,Show,Read,Generic)+ {-------------------}  @@ -786,15 +796,16 @@ -- | Simple Inverse FMIndex function.  seqFromFMIndexB :: FMIndexB                 -> FFMIndexSeqB-seqFromFMIndexB (FMIndexB (CcB DS.Empty,_))    = DS.Empty-seqFromFMIndexB (FMIndexB (_,OccCKB DS.Empty)) = DS.Empty-seqFromFMIndexB xs                             = do+seqFromFMIndexB (FMIndexB (CcB DS.Empty,_,_))    = DS.Empty+seqFromFMIndexB (FMIndexB (_,OccCKB DS.Empty,_)) = DS.Empty+seqFromFMIndexB (FMIndexB (_,_,SAB DS.Empty))    = DS.Empty+seqFromFMIndexB xs                               = do   let xss = (\(OccCKB b) -> b) $-            (\(_,b) -> b)      $+            (\(_,b,_) -> b)    $             (\(FMIndexB b) -> b) xs   iFFMIndexB xss     where-      iFFMIndexB DS.Empty         = DS.Empty +      iFFMIndexB DS.Empty         = DS.Empty       iFFMIndexB ((_,b) DS.:<| _) =         fmap (\(_,_,e) -> e) b @@ -809,11 +820,12 @@ -- | Simple Inverse FMIndex function. seqFromFMIndexT :: FMIndexT                 -> FFMIndexSeqT-seqFromFMIndexT (FMIndexT (CcT DS.Empty,_))    = DS.Empty-seqFromFMIndexT (FMIndexT (_,OccCKT DS.Empty)) = DS.Empty-seqFromFMIndexT xs                             = do+seqFromFMIndexT (FMIndexT (CcT DS.Empty,_,_))    = DS.Empty+seqFromFMIndexT (FMIndexT (_,OccCKT DS.Empty,_)) = DS.Empty+seqFromFMIndexT (FMIndexT (_,_,SAT DS.Empty))    = DS.Empty+seqFromFMIndexT xs                               = do   let xss = (\(OccCKT t) -> t) $-            (\(_,b) -> b)      $+            (\(_,b,_) -> b)    $             (\(FMIndexT t) -> t) xs   iFFMIndexT xss     where@@ -891,10 +903,11 @@ countFMIndexB :: PBCPat               -> FMIndexB               -> ST s CIntB -countFMIndexB DS.Empty _                              = return Nothing-countFMIndexB _        (FMIndexB (CcB DS.Empty,_))    = return Nothing-countFMIndexB _        (FMIndexB (_,OccCKB DS.Empty)) = return Nothing-countFMIndexB xs       ys                             = do+countFMIndexB DS.Empty _                                = return Nothing+countFMIndexB _        (FMIndexB (CcB DS.Empty,_,_))    = return Nothing+countFMIndexB _        (FMIndexB (_,OccCKB DS.Empty,_)) = return Nothing+countFMIndexB _        (FMIndexB (_,_,SAB DS.Empty))    = return Nothing+countFMIndexB xs       ys                               = do   bccounter      <- emptySTCCounterB   bcbool         <- emptySTCBoolB   bccurrentstart <- emptySTCCurrentStartB@@ -919,10 +932,10 @@       iCB DS.Empty      _  _   _   _    _    = pure ()       iCB (as DS.:|> a) bs bcc bcb bccs bcce = do         let ccbbs = (\(CcB b) -> b) $-                    (\(a,_) -> a)   $+                    (\(a,_,_) -> a) $                     (\(FMIndexB b) -> b) bs         let coccckbs = (\(OccCKB b) -> b) $-                       (\(_,b) -> b)      $+                       (\(_,b,_) -> b)    $                        (\(FMIndexB b) -> b) bs         cbcc <- readSTRef bcc         cbccs <- readSTRef bccs@@ -1061,10 +1074,11 @@ countFMIndexT :: PTCPat               -> FMIndexT               -> ST s CIntT-countFMIndexT DS.Empty _                              = return Nothing-countFMIndexT _        (FMIndexT (CcT DS.Empty,_))    = return Nothing-countFMIndexT _        (FMIndexT (_,OccCKT DS.Empty)) = return Nothing-countFMIndexT xs       ys                             = do+countFMIndexT DS.Empty _                                = return Nothing+countFMIndexT _        (FMIndexT (CcT DS.Empty,_,_))    = return Nothing+countFMIndexT _        (FMIndexT (_,OccCKT DS.Empty,_)) = return Nothing+countFMIndexT _        (FMIndexT (_,_,SAT DS.Empty))    = return Nothing+countFMIndexT xs       ys                               = do   tccounter      <- emptySTCCounterT   tcbool         <- emptySTCBoolT   tccurrentstart <- emptySTCCurrentStartT@@ -1089,10 +1103,10 @@       iCT DS.Empty      _  _   _   _    _    = pure ()       iCT (as DS.:|> a) bs tcc tcb tccs tcce = do         let cctbs = (\(CcT t) -> t) $-                    (\(a,_) -> a)   $+                    (\(a,_,_) -> a) $                     (\(FMIndexT t) -> t) bs         let coccckts = (\(OccCKT t) -> t) $-                       (\(_,b) -> b)      $+                       (\(_,b,_) -> b)    $                        (\(FMIndexT t) -> t) bs         ctcc <- readSTRef tcc         ctccs <- readSTRef tccs@@ -1231,10 +1245,11 @@ locateFMIndexB :: PBLPat                -> FMIndexB                -> ST s LIntB-locateFMIndexB DS.Empty _                              = return DS.Empty-locateFMIndexB _        (FMIndexB (CcB DS.Empty,_))    = return DS.Empty-locateFMIndexB _        (FMIndexB (_,OccCKB DS.Empty)) = return DS.Empty -locateFMIndexB xs       ys                             = do+locateFMIndexB DS.Empty _                                = return DS.Empty+locateFMIndexB _        (FMIndexB (CcB DS.Empty,_,_))    = return DS.Empty+locateFMIndexB _        (FMIndexB (_,OccCKB DS.Empty,_)) = return DS.Empty+locateFMIndexB _        (FMIndexB (_,_,SAB DS.Empty))    = return DS.Empty +locateFMIndexB xs       ys                               = do   blcounter      <- emptySTLCounterB   blbool         <- emptySTLBoolB   blcurrentstart <- emptySTLCurrentStartB@@ -1261,10 +1276,10 @@       iLB DS.Empty      _  _   _   _    _    = pure ()       iLB (as DS.:|> a) bs blc blb blcs blce = do         let ccbbs = (\(CcB b) -> b) $-                    (\(a,_) -> a)   $+                    (\(a,_,_) -> a) $                     (\(FMIndexB b) -> b) bs         let coccckbs = (\(OccCKB b) -> b) $-                       (\(_,b) -> b)      $+                       (\(_,b,_) -> b)    $                        (\(FMIndexB b) -> b) bs         cblc <- readSTRef blc         cblcs <- readSTRef blcs@@ -1403,10 +1418,11 @@ locateFMIndexT :: PTLPat                -> FMIndexT                -> ST s LIntT-locateFMIndexT DS.Empty _                              = return DS.Empty-locateFMIndexT _        (FMIndexT (CcT DS.Empty,_))    = return DS.Empty-locateFMIndexT _        (FMIndexT (_,OccCKT DS.Empty)) = return DS.Empty-locateFMIndexT xs       ys                             = do+locateFMIndexT DS.Empty _                                = return DS.Empty+locateFMIndexT _        (FMIndexT (CcT DS.Empty,_,_))    = return DS.Empty+locateFMIndexT _        (FMIndexT (_,OccCKT DS.Empty,_)) = return DS.Empty+locateFMIndexT _        (FMIndexT (_,_,SAT DS.Empty))    = return DS.Empty+locateFMIndexT xs       ys                               = do   tlcounter      <- emptySTLCounterT   tlbool         <- emptySTLBoolT   tlcurrentstart <- emptySTLCurrentStartT@@ -1433,10 +1449,10 @@       iLT DS.Empty      _  _   _   _    _    = pure ()       iLT (as DS.:|> a) bs tlc tlb tlcs tlce = do         let cctbs = (\(CcT t) -> t) $-                    (\(a,_) -> a)   $+                    (\(a,_,_) -> a) $                     (\(FMIndexT t) -> t) bs         let coccckts = (\(OccCKT t) -> t) $-                       (\(_,b) -> b)      $+                       (\(_,b,_) -> b)    $                        (\(FMIndexT t) -> t) bs         ctlc <- readSTRef tlc         ctlcs <- readSTRef tlcs
text-compression.cabal view
@@ -20,7 +20,7 @@ -- PVP summary:     +-+------- breaking API changes --                  | | +----- non-breaking API additions --                  | | | +--- code changes with no API change-version:            0.1.0.24+version:            0.1.0.25  -- A short (one-line) description of the package. synopsis:           A text compression library.