packages feed

succinct-0.0.0.1: components/succinct-dsv/app/App/Commands/IndexWord8s.hs

module App.Commands.IndexWord8s
  ( cmdIndexWord8s
  ) where

import Control.Lens
import Data.Generics.Product.Any
import HaskellWorks.Data.Vector.AsVector64
import Options.Applicative

import qualified App.Commands.Options.Type           as Z
import qualified App.IO                              as IO
import qualified Data.ByteString.Lazy                as LBS
import qualified HaskellWorks.Data.ByteString        as BS
import qualified HaskellWorks.Data.ByteString.Lazy   as LBS
import qualified Data.Succinct.Simd.Comparison.Avx2  as AVX2
import qualified Data.Succinct.Simd.Comparison.Stock as STOCK

runIndexWord8sNormal :: Z.IndexWord8sOptions -> IO ()
runIndexWord8sNormal opts = do
  contents <- IO.readInputFile (opts ^. the @"source")

  IO.writeOutputFile (opts ^. the @"target") $ contents
    & LBS.toLazyByteString
    . fmap (STOCK.cmpEqWord8s 44 . asVector64)
    . BS.resegmentPadded 64
    . LBS.toChunks

runIndexWord8sSimd :: Z.IndexWord8sOptions -> IO ()
runIndexWord8sSimd opts = do
  contents <- IO.readInputFile (opts ^. the @"source")

  IO.writeOutputFile (opts ^. the @"target") $ contents
    & LBS.toLazyByteString
    . fmap (AVX2.cmpEqWord8s 44 . asVector64)
    . BS.resegmentPadded 64
    . LBS.toChunks

runIndexWord8s :: Z.IndexWord8sOptions -> IO ()
runIndexWord8s opts
  | opts ^. the @"simd"  = runIndexWord8sSimd   opts
  | otherwise       = runIndexWord8sNormal opts

optsIndexWord8s :: Parser Z.IndexWord8sOptions
optsIndexWord8s = Z.IndexWord8sOptions
  <$> strOption
        (   long "input"
        <>  help "Input file"
        <>  metavar "FILE"
        <>  showDefault
        <>  value "-"
        )
  <*> strOption
        (   long "output"
        <>  help "Output file"
        <>  metavar "FILE"
        <>  showDefault
        <>  value "-"
        )
  <*> switch
        (   long "simd"
        <>  help "Use simd method"
        )

cmdIndexWord8s :: Mod CommandFields (IO ())
cmdIndexWord8s = command "index-word8s"  $ flip info idm $ runIndexWord8s <$> optsIndexWord8s