{-# LANGUAGE MultiWayIf #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ViewPatterns #-}
{-# LANGUAGE Strict #-}
module Data.MTF (
bytestringToBWTToMTFB,
bytestringToBWTToMTFT,
textToBWTToMTFB,
textToBWTToMTFT,
textBWTToMTFB,
bytestringBWTToMTFB,
textBWTToMTFT,
bytestringBWTToMTFT,
textToMTFB,
bytestringToMTFB,
textToMTFT,
bytestringToMTFT,
bytestringFromBWTFromMTFB,
bytestringFromBWTFromMTFT,
textFromBWTFromMTFB,
textFromBWTFromMTFT,
textBWTFromMTFT,
bytestringBWTFromMTFT,
textBWTFromMTFB,
bytestringBWTFromMTFB,
textFromMTFB,
bytestringFromMTFB,
textFromMTFT,
bytestringFromMTFT
) where
import Data.BWT
import Data.BWT.Internal
import Data.MTF.Internal
import Control.Monad()
import Control.Monad.ST as CMST
import Control.Monad.State.Strict()
import Data.ByteString as BS
import Data.ByteString.Char8()
import Data.Char()
import Data.Foldable()
import Data.Maybe as DMaybe (isNothing,fromJust)
import Data.Sequence as DS (Seq(..))
import Data.STRef()
import Data.Text as DText
import Data.Text.Encoding as DTE (decodeUtf8,encodeUtf8)
import Data.Word (Word8)
import Prelude as P
bytestringToBWTToMTFB :: ByteString ->
MTFB
bytestringToBWTToMTFB :: ByteString -> MTFB
bytestringToBWTToMTFB = BWT Word8 -> MTFB
bytestringBWTToMTFB forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> BWT Word8
bytestringToBWT
bytestringToBWTToMTFT :: ByteString ->
MTFT
bytestringToBWTToMTFT :: ByteString -> MTFT
bytestringToBWTToMTFT = BWT Word8 -> MTFT
bytestringBWTToMTFT forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> BWT Word8
bytestringToBWT
textToBWTToMTFB :: Text ->
MTFB
textToBWTToMTFB :: Text -> MTFB
textToBWTToMTFB = TextBWT -> MTFB
textBWTToMTFB forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> TextBWT
textToBWT
textToBWTToMTFT :: Text ->
MTFT
textToBWTToMTFT :: Text -> MTFT
textToBWTToMTFT = TextBWT -> MTFT
textBWTToMTFT forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> TextBWT
textToBWT
textBWTToMTFB :: TextBWT
-> MTFB
textBWTToMTFB :: TextBWT -> MTFB
textBWTToMTFB TextBWT
xs =
(Seq Int, Seq (Maybe ByteString)) -> MTFB
MTFB (forall a. (forall s. ST s a) -> a
CMST.runST forall a b. (a -> b) -> a -> b
$ forall s.
Seq (Maybe ByteString) -> ST s (Seq Int, Seq (Maybe ByteString))
seqToMTFB Seq (Maybe ByteString)
xss)
where
xss :: Seq (Maybe ByteString)
xss = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Maybe Word8
x -> if | forall a. Maybe a -> Bool
isNothing Maybe Word8
x
-> forall a. Maybe a
Nothing
| Bool
otherwise
-> forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$
Word8 -> ByteString
BS.singleton forall a b. (a -> b) -> a -> b
$
forall a. HasCallStack => Maybe a -> a
fromJust Maybe Word8
x
)
((\(BWT Seq (Maybe Word8)
t) -> Seq (Maybe Word8)
t) forall a b. (a -> b) -> a -> b
$
((\(TextBWT BWT Word8
t) -> BWT Word8
t) TextBWT
xs))
bytestringBWTToMTFB :: BWT Word8
-> MTFB
bytestringBWTToMTFB :: BWT Word8 -> MTFB
bytestringBWTToMTFB BWT Word8
xs =
(Seq Int, Seq (Maybe ByteString)) -> MTFB
MTFB (forall a. (forall s. ST s a) -> a
CMST.runST forall a b. (a -> b) -> a -> b
$ forall s.
Seq (Maybe ByteString) -> ST s (Seq Int, Seq (Maybe ByteString))
seqToMTFB Seq (Maybe ByteString)
xss)
where
xss :: Seq (Maybe ByteString)
xss = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Maybe Word8
x -> if | forall a. Maybe a -> Bool
isNothing Maybe Word8
x
-> forall a. Maybe a
Nothing
| Bool
otherwise
-> forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$
Word8 -> ByteString
BS.singleton forall a b. (a -> b) -> a -> b
$
forall a. HasCallStack => Maybe a -> a
fromJust Maybe Word8
x
)
((\(BWT Seq (Maybe Word8)
t) -> Seq (Maybe Word8)
t) BWT Word8
xs)
textBWTToMTFT :: TextBWT
-> MTFT
textBWTToMTFT :: TextBWT -> MTFT
textBWTToMTFT TextBWT
xs =
(Seq Int, Seq (Maybe Text)) -> MTFT
MTFT (forall a. (forall s. ST s a) -> a
CMST.runST forall a b. (a -> b) -> a -> b
$ forall s. Seq (Maybe Text) -> ST s (Seq Int, Seq (Maybe Text))
seqToMTFT Seq (Maybe Text)
xss)
where
xss :: Seq (Maybe Text)
xss = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Maybe Word8
x -> if | forall a. Maybe a -> Bool
isNothing Maybe Word8
x
-> forall a. Maybe a
Nothing
| Bool
otherwise
-> forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$
ByteString -> Text
DTE.decodeUtf8 forall a b. (a -> b) -> a -> b
$
Word8 -> ByteString
BS.singleton forall a b. (a -> b) -> a -> b
$
forall a. HasCallStack => Maybe a -> a
fromJust Maybe Word8
x
)
((\(BWT Seq (Maybe Word8)
t) -> Seq (Maybe Word8)
t) forall a b. (a -> b) -> a -> b
$
((\(TextBWT BWT Word8
t) -> BWT Word8
t) TextBWT
xs))
bytestringBWTToMTFT :: BWT Word8
-> MTFT
bytestringBWTToMTFT :: BWT Word8 -> MTFT
bytestringBWTToMTFT BWT Word8
xs =
(Seq Int, Seq (Maybe Text)) -> MTFT
MTFT (forall a. (forall s. ST s a) -> a
CMST.runST forall a b. (a -> b) -> a -> b
$ forall s. Seq (Maybe Text) -> ST s (Seq Int, Seq (Maybe Text))
seqToMTFT Seq (Maybe Text)
xss)
where
xss :: Seq (Maybe Text)
xss = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Maybe Word8
x -> if | forall a. Maybe a -> Bool
isNothing Maybe Word8
x
-> forall a. Maybe a
Nothing
| Bool
otherwise
-> forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$
ByteString -> Text
DTE.decodeUtf8 forall a b. (a -> b) -> a -> b
$
Word8 -> ByteString
BS.singleton forall a b. (a -> b) -> a -> b
$
forall a. HasCallStack => Maybe a -> a
fromJust Maybe Word8
x
)
((\(BWT Seq (Maybe Word8)
t) -> Seq (Maybe Word8)
t) BWT Word8
xs)
textToMTFB :: Seq (Maybe Text)
-> MTFB
textToMTFB :: Seq (Maybe Text) -> MTFB
textToMTFB Seq (Maybe Text)
DS.Empty = (Seq Int, Seq (Maybe ByteString)) -> MTFB
MTFB (forall a. Seq a
DS.Empty,forall a. Seq a
DS.Empty)
textToMTFB Seq (Maybe Text)
xs =
(Seq Int, Seq (Maybe ByteString)) -> MTFB
MTFB (forall a. (forall s. ST s a) -> a
CMST.runST forall a b. (a -> b) -> a -> b
$ forall s.
Seq (Maybe ByteString) -> ST s (Seq Int, Seq (Maybe ByteString))
seqToMTFB Seq (Maybe ByteString)
xss)
where
xss :: Seq (Maybe ByteString)
xss = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Maybe Text
x -> if | forall a. Maybe a -> Bool
isNothing Maybe Text
x
-> forall a. Maybe a
Nothing
| Bool
otherwise
-> forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$
Text -> ByteString
DTE.encodeUtf8 forall a b. (a -> b) -> a -> b
$
forall a. HasCallStack => Maybe a -> a
fromJust Maybe Text
x
)
Seq (Maybe Text)
xs
bytestringToMTFB :: Seq (Maybe ByteString)
-> MTFB
bytestringToMTFB :: Seq (Maybe ByteString) -> MTFB
bytestringToMTFB Seq (Maybe ByteString)
DS.Empty = (Seq Int, Seq (Maybe ByteString)) -> MTFB
MTFB (forall a. Seq a
DS.Empty,forall a. Seq a
DS.Empty)
bytestringToMTFB Seq (Maybe ByteString)
xs =
(Seq Int, Seq (Maybe ByteString)) -> MTFB
MTFB (forall a. (forall s. ST s a) -> a
CMST.runST forall a b. (a -> b) -> a -> b
$ forall s.
Seq (Maybe ByteString) -> ST s (Seq Int, Seq (Maybe ByteString))
seqToMTFB Seq (Maybe ByteString)
xs)
textToMTFT :: Seq (Maybe Text)
-> MTFT
textToMTFT :: Seq (Maybe Text) -> MTFT
textToMTFT Seq (Maybe Text)
DS.Empty = (Seq Int, Seq (Maybe Text)) -> MTFT
MTFT (forall a. Seq a
DS.Empty,forall a. Seq a
DS.Empty)
textToMTFT Seq (Maybe Text)
xs =
(Seq Int, Seq (Maybe Text)) -> MTFT
MTFT (forall a. (forall s. ST s a) -> a
CMST.runST forall a b. (a -> b) -> a -> b
$ forall s. Seq (Maybe Text) -> ST s (Seq Int, Seq (Maybe Text))
seqToMTFT Seq (Maybe Text)
xs)
bytestringToMTFT :: Seq (Maybe ByteString)
-> MTFT
bytestringToMTFT :: Seq (Maybe ByteString) -> MTFT
bytestringToMTFT Seq (Maybe ByteString)
DS.Empty = (Seq Int, Seq (Maybe Text)) -> MTFT
MTFT (forall a. Seq a
DS.Empty,forall a. Seq a
DS.Empty)
bytestringToMTFT Seq (Maybe ByteString)
xs =
(Seq Int, Seq (Maybe Text)) -> MTFT
MTFT (forall a. (forall s. ST s a) -> a
CMST.runST forall a b. (a -> b) -> a -> b
$ forall s. Seq (Maybe Text) -> ST s (Seq Int, Seq (Maybe Text))
seqToMTFT Seq (Maybe Text)
xss)
where
xss :: Seq (Maybe Text)
xss = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Maybe ByteString
x -> if | forall a. Maybe a -> Bool
isNothing Maybe ByteString
x
-> forall a. Maybe a
Nothing
| Bool
otherwise
-> forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$
ByteString -> Text
DTE.decodeUtf8 forall a b. (a -> b) -> a -> b
$
forall a. HasCallStack => Maybe a -> a
fromJust Maybe ByteString
x
)
Seq (Maybe ByteString)
xs
bytestringFromBWTFromMTFB :: MTFB
-> ByteString
bytestringFromBWTFromMTFB :: MTFB -> ByteString
bytestringFromBWTFromMTFB = BWT ByteString -> ByteString
bytestringFromByteStringBWT forall b c a. (b -> c) -> (a -> b) -> a -> c
. MTFB -> BWT ByteString
bytestringBWTFromMTFB
bytestringFromBWTFromMTFT :: MTFT
-> ByteString
bytestringFromBWTFromMTFT :: MTFT -> ByteString
bytestringFromBWTFromMTFT MTFT
xs = BWT ByteString -> ByteString
bytestringFromByteStringBWT forall a b. (a -> b) -> a -> b
$
forall a. Seq (Maybe a) -> BWT a
BWT forall a b. (a -> b) -> a -> b
$
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Maybe Text
x -> if | forall a. Maybe a -> Bool
isNothing Maybe Text
x
-> forall a. Maybe a
Nothing
| Bool
otherwise
-> forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$
Text -> ByteString
DTE.encodeUtf8 forall a b. (a -> b) -> a -> b
$
forall a. HasCallStack => Maybe a -> a
fromJust Maybe Text
x
)
forall a b. (a -> b) -> a -> b
$
((\(BWT Seq (Maybe Text)
t) -> Seq (Maybe Text)
t) (MTFT -> BWT Text
textBWTFromMTFT MTFT
xs))
textFromBWTFromMTFB :: MTFB
-> Text
textFromBWTFromMTFB :: MTFB -> Text
textFromBWTFromMTFB = ByteString -> Text
DTE.decodeUtf8 forall b c a. (b -> c) -> (a -> b) -> a -> c
. BWT ByteString -> ByteString
bytestringFromByteStringBWT forall b c a. (b -> c) -> (a -> b) -> a -> c
. MTFB -> BWT ByteString
bytestringBWTFromMTFB
textFromBWTFromMTFT :: MTFT
-> Text
textFromBWTFromMTFT :: MTFT -> Text
textFromBWTFromMTFT = ByteString -> Text
DTE.decodeUtf8 forall b c a. (b -> c) -> (a -> b) -> a -> c
. BWT ByteString -> ByteString
bytestringFromByteStringBWT forall b c a. (b -> c) -> (a -> b) -> a -> c
. MTFT -> BWT ByteString
bytestringBWTFromMTFT
textBWTFromMTFT :: MTFT
-> BWT Text
textBWTFromMTFT :: MTFT -> BWT Text
textBWTFromMTFT (MTFT (Seq Int
DS.Empty,Seq (Maybe Text)
_)) = forall a. Seq (Maybe a) -> BWT a
BWT forall a. Seq a
DS.Empty
textBWTFromMTFT (MTFT (Seq Int
_,Seq (Maybe Text)
DS.Empty)) = forall a. Seq (Maybe a) -> BWT a
BWT forall a. Seq a
DS.Empty
textBWTFromMTFT MTFT
xs =
forall a. Seq (Maybe a) -> BWT a
BWT (forall a. (forall s. ST s a) -> a
CMST.runST forall a b. (a -> b) -> a -> b
$ forall s. MTFT -> ST s (Seq (Maybe Text))
seqFromMTFT MTFT
xs)
bytestringBWTFromMTFT :: MTFT
-> BWT ByteString
bytestringBWTFromMTFT :: MTFT -> BWT ByteString
bytestringBWTFromMTFT (MTFT (Seq Int
DS.Empty,Seq (Maybe Text)
_)) = forall a. Seq (Maybe a) -> BWT a
BWT forall a. Seq a
DS.Empty
bytestringBWTFromMTFT (MTFT (Seq Int
_,Seq (Maybe Text)
DS.Empty)) = forall a. Seq (Maybe a) -> BWT a
BWT forall a. Seq a
DS.Empty
bytestringBWTFromMTFT MTFT
xs = do
let originalbwtb :: Seq (Maybe Text)
originalbwtb = forall a. (forall s. ST s a) -> a
CMST.runST forall a b. (a -> b) -> a -> b
$ forall s. MTFT -> ST s (Seq (Maybe Text))
seqFromMTFT MTFT
xs
forall a. Seq (Maybe a) -> BWT a
BWT (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Maybe Text
x -> if | forall a. Maybe a -> Bool
isNothing Maybe Text
x
-> forall a. Maybe a
Nothing
| Bool
otherwise
-> forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$
Text -> ByteString
DTE.encodeUtf8 forall a b. (a -> b) -> a -> b
$
forall a. HasCallStack => Maybe a -> a
fromJust Maybe Text
x
) Seq (Maybe Text)
originalbwtb)
textBWTFromMTFB :: MTFB
-> BWT Text
textBWTFromMTFB :: MTFB -> BWT Text
textBWTFromMTFB (MTFB (Seq Int
DS.Empty,Seq (Maybe ByteString)
_)) = forall a. Seq (Maybe a) -> BWT a
BWT forall a. Seq a
DS.Empty
textBWTFromMTFB (MTFB (Seq Int
_,Seq (Maybe ByteString)
DS.Empty)) = forall a. Seq (Maybe a) -> BWT a
BWT forall a. Seq a
DS.Empty
textBWTFromMTFB MTFB
xs = do
let originalbwtt :: Seq (Maybe ByteString)
originalbwtt = forall a. (forall s. ST s a) -> a
CMST.runST forall a b. (a -> b) -> a -> b
$ forall s. MTFB -> ST s (Seq (Maybe ByteString))
seqFromMTFB MTFB
xs
forall a. Seq (Maybe a) -> BWT a
BWT (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Maybe ByteString
x -> if | forall a. Maybe a -> Bool
isNothing Maybe ByteString
x
-> forall a. Maybe a
Nothing
| Bool
otherwise
-> forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$
ByteString -> Text
DTE.decodeUtf8 forall a b. (a -> b) -> a -> b
$
forall a. HasCallStack => Maybe a -> a
fromJust Maybe ByteString
x
) Seq (Maybe ByteString)
originalbwtt)
bytestringBWTFromMTFB :: MTFB
-> BWT ByteString
bytestringBWTFromMTFB :: MTFB -> BWT ByteString
bytestringBWTFromMTFB (MTFB (Seq Int
DS.Empty,Seq (Maybe ByteString)
_)) = forall a. Seq (Maybe a) -> BWT a
BWT forall a. Seq a
DS.Empty
bytestringBWTFromMTFB (MTFB (Seq Int
_,Seq (Maybe ByteString)
DS.Empty)) = forall a. Seq (Maybe a) -> BWT a
BWT forall a. Seq a
DS.Empty
bytestringBWTFromMTFB MTFB
xs =
forall a. Seq (Maybe a) -> BWT a
BWT (forall a. (forall s. ST s a) -> a
CMST.runST forall a b. (a -> b) -> a -> b
$ forall s. MTFB -> ST s (Seq (Maybe ByteString))
seqFromMTFB MTFB
xs)
textFromMTFB :: MTFB
-> Seq (Maybe Text)
textFromMTFB :: MTFB -> Seq (Maybe Text)
textFromMTFB (MTFB (Seq Int
DS.Empty,Seq (Maybe ByteString)
_)) = forall a. Seq a
DS.Empty
textFromMTFB (MTFB (Seq Int
_,Seq (Maybe ByteString)
DS.Empty)) = forall a. Seq a
DS.Empty
textFromMTFB MTFB
xs = do
let originalt :: Seq (Maybe ByteString)
originalt = forall a. (forall s. ST s a) -> a
CMST.runST forall a b. (a -> b) -> a -> b
$ forall s. MTFB -> ST s (Seq (Maybe ByteString))
seqFromMTFB MTFB
xs
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Maybe ByteString
x -> if | forall a. Maybe a -> Bool
isNothing Maybe ByteString
x
-> forall a. Maybe a
Nothing
| Bool
otherwise
-> forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$
ByteString -> Text
DTE.decodeUtf8 forall a b. (a -> b) -> a -> b
$
forall a. HasCallStack => Maybe a -> a
fromJust Maybe ByteString
x
) Seq (Maybe ByteString)
originalt
bytestringFromMTFB :: MTFB
-> Seq (Maybe ByteString)
bytestringFromMTFB :: MTFB -> Seq (Maybe ByteString)
bytestringFromMTFB (MTFB (Seq Int
DS.Empty,Seq (Maybe ByteString)
_)) = forall a. Seq a
DS.Empty
bytestringFromMTFB (MTFB (Seq Int
_,Seq (Maybe ByteString)
DS.Empty)) = forall a. Seq a
DS.Empty
bytestringFromMTFB MTFB
xs =
forall a. (forall s. ST s a) -> a
CMST.runST forall a b. (a -> b) -> a -> b
$ forall s. MTFB -> ST s (Seq (Maybe ByteString))
seqFromMTFB MTFB
xs
textFromMTFT :: MTFT
-> Seq (Maybe Text)
textFromMTFT :: MTFT -> Seq (Maybe Text)
textFromMTFT (MTFT (Seq Int
DS.Empty,Seq (Maybe Text)
_)) = forall a. Seq a
DS.Empty
textFromMTFT (MTFT (Seq Int
_,Seq (Maybe Text)
DS.Empty)) = forall a. Seq a
DS.Empty
textFromMTFT MTFT
xs =
forall a. (forall s. ST s a) -> a
CMST.runST forall a b. (a -> b) -> a -> b
$ forall s. MTFT -> ST s (Seq (Maybe Text))
seqFromMTFT MTFT
xs
bytestringFromMTFT :: MTFT
-> Seq (Maybe ByteString)
bytestringFromMTFT :: MTFT -> Seq (Maybe ByteString)
bytestringFromMTFT (MTFT (Seq Int
DS.Empty,Seq (Maybe Text)
_)) = forall a. Seq a
DS.Empty
bytestringFromMTFT (MTFT (Seq Int
_,Seq (Maybe Text)
DS.Empty)) = forall a. Seq a
DS.Empty
bytestringFromMTFT MTFT
xs = do
let originalb :: Seq (Maybe Text)
originalb = forall a. (forall s. ST s a) -> a
CMST.runST forall a b. (a -> b) -> a -> b
$ forall s. MTFT -> ST s (Seq (Maybe Text))
seqFromMTFT MTFT
xs
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\Maybe Text
x -> if | forall a. Maybe a -> Bool
isNothing Maybe Text
x
-> forall a. Maybe a
Nothing
| Bool
otherwise
-> forall a. a -> Maybe a
Just forall a b. (a -> b) -> a -> b
$
Text -> ByteString
DTE.encodeUtf8 forall a b. (a -> b) -> a -> b
$
forall a. HasCallStack => Maybe a -> a
fromJust Maybe Text
x
) Seq (Maybe Text)
originalb