packages feed

hw-simd-cli-0.0.0.1: app/App/Commands/CmpEq8s.hs

{-# LANGUAGE BangPatterns     #-}
{-# LANGUAGE DataKinds        #-}
{-# LANGUAGE TypeApplications #-}

module App.Commands.CmpEq8s
  ( cmdCmpEq8s
  ) where

import App.Char
import Control.Lens
import Data.Generics.Product.Any
import HaskellWorks.Data.Vector.AsVector64s
import Options.Applicative                  hiding (columns)

import qualified App.Commands.Options.Type               as Z
import qualified App.IO                                  as IO
import qualified HaskellWorks.Data.ByteString.Lazy       as LBS
import qualified HaskellWorks.Data.Simd.ChunkString      as CS
import qualified HaskellWorks.Data.Simd.Comparison.Avx2  as AVX2
import qualified HaskellWorks.Data.Simd.Comparison.Stock as STOCK
import qualified HaskellWorks.Simd.Cli.Comparison        as SERIAL
import qualified System.Exit                             as IO
import qualified System.IO                               as IO

{- HLINT ignore "Redundant do" -}

runCmpEq8s :: Z.CmpEq8sOptions -> IO ()
runCmpEq8s opts = do
  let !delimiter  = opts ^. the @"delimiter"

  case opts ^. the @"cmpMethod" of
    "new-stock" -> do
      cs <- IO.openInputFile (opts ^. the @"inputFile") >>= CS.hGetContents

      IO.writeOutputFile (opts ^. the @"outputFile")
        $ LBS.toLazyByteString
        $ STOCK.cmpEqWord8s delimiter cs
    "new-avx2" -> do
      cs <- IO.openInputFile (opts ^. the @"inputFile") >>= CS.hGetContents

      IO.writeOutputFile (opts ^. the @"outputFile")
        $ LBS.toLazyByteString
        $ AVX2.cmpEqWord8s delimiter cs
    "stock" -> do
      bs <- IO.readInputFile (opts ^. the @"inputFile")
      let v = asVector64s 64 bs

      IO.writeOutputFile (opts ^. the @"outputFile")
        $ LBS.toLazyByteString
        $ STOCK.cmpEqWord8s delimiter v
    "avx2" -> do
      bs <- IO.readInputFile (opts ^. the @"inputFile")
      let v = asVector64s 64 bs

      IO.writeOutputFile (opts ^. the @"outputFile")
        $ LBS.toLazyByteString
        $ AVX2.cmpEqWord8s delimiter v
    "serial" -> do
      bs <- IO.readInputFile (opts ^. the @"inputFile")

      IO.writeOutputFile (opts ^. the @"outputFile")
        $ SERIAL.cmpEqWord8s delimiter bs
    m -> do
      IO.hPutStrLn IO.stderr $ "Unsupported method: " <> m
      IO.exitFailure

optsCmpEq8s :: Parser Z.CmpEq8sOptions
optsCmpEq8s = Z.CmpEq8sOptions
  <$> strOption
        (   long "input"
        <>  short 'i'
        <>  help "Input Text file"
        <>  metavar "STRING"
        )
  <*> option readWord8
        (   long "input-delimiter"
        <>  short 'd'
        <>  help "Text delimiter"
        <>  metavar "CHAR"
        )
  <*> strOption
        (   long "output"
        <>  short 'o'
        <>  help "Output Text file"
        <>  metavar "STRING"
        )
  <*> strOption
        (   long "cmp-method"
        <>  short 'm'
        <>  help "Comparison method"
        <>  metavar "STRING"
        )

cmdCmpEq8s :: Mod CommandFields (IO ())
cmdCmpEq8s = command "cmpeqword8s"  $ flip info idm $ runCmpEq8s <$> optsCmpEq8s