packages feed

hw-dump-0.1.0.0: app/App/Commands/Complement.hs

{-# LANGUAGE DataKinds           #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications    #-}

module App.Commands.Complement
  ( cmdComplement
  ) where

import Control.Lens
import Data.Generics.Product.Any
import Data.Semigroup                 ((<>))
import HaskellWorks.Data.Bits.BitWise
import Options.Applicative            hiding (columns)

import qualified App.Commands.Options.Type as Z
import qualified Data.ByteString.Lazy      as LBS

{-# ANN module ("HLint: ignore Redundant do"      :: String) #-}
{-# ANN module ("HLint: ignore Redundant return"  :: String) #-}

runComplement :: Z.ComplementOptions -> IO ()
runComplement opts = do
  let inputFile   = opts ^. the @"inputFile"
  let outputFile  = opts ^. the @"outputFile"

  LBS.readFile inputFile <&> LBS.map comp >>= LBS.writeFile outputFile

optsComplement :: Parser Z.ComplementOptions
optsComplement = Z.ComplementOptions
  <$> strOption
        (   long "input-file"
        <>  help "Input file"
        <>  metavar "FILE"
        )
  <*> strOption
        (   long "output-file"
        <>  help "Output file"
        <>  metavar "FILE"
        )

cmdComplement :: Mod CommandFields (IO ())
cmdComplement = command "complement"  $ flip info idm $ runComplement <$> optsComplement