packages feed

hw-xml-0.4.0.1: app/App/Commands/CreateIndex.hs

{-# LANGUAGE DataKinds            #-}
{-# LANGUAGE DeriveGeneric        #-}
{-# LANGUAGE FlexibleInstances    #-}
{-# LANGUAGE OverloadedStrings    #-}
{-# LANGUAGE ScopedTypeVariables  #-}
{-# LANGUAGE TypeApplications     #-}
{-# LANGUAGE TypeSynonymInstances #-}

module App.Commands.CreateIndex
  ( cmdCreateIndex
  ) where

import App.Options
import Control.Lens
import Control.Monad
import Data.Generics.Product.Any
import Data.Semigroup                                   ((<>))
import HaskellWorks.Data.Xml.Internal.ToIbBp64
import HaskellWorks.Data.Xml.Succinct.Cursor.BlankedXml
import HaskellWorks.Data.Xml.Succinct.Cursor.MMap
import Options.Applicative                              hiding (columns)

import qualified App.Commands.Types                as Z
import qualified Data.ByteString                   as BS
import qualified Data.ByteString.Lazy              as LBS
import qualified Data.Text.IO                      as TIO
import qualified HaskellWorks.Data.ByteString.Lazy as LBS
import qualified Options.Applicative               as OA
import qualified System.Exit                       as IO
import qualified System.IO                         as IO

runCreateIndex :: Z.CreateIndexOptions -> IO ()
runCreateIndex opt = do
  let input     = opt ^. the @"input"
  let ibOutput  = opt ^. the @"ibOutput"
  let bpOutput  = opt ^. the @"bpOutput"
  let method    = opt ^. the @"method"

  case method of
    "memory" -> do
      cursor <- mmapSlowCursor input

      LBS.writeFile ibOutput (LBS.toLazyByteString (cursor ^. the @"interests"      . the @1))
      LBS.writeFile bpOutput (LBS.toLazyByteString (cursor ^. the @"balancedParens" . the @1))
    "stream" -> do
      lbs <- LBS.readFile input
      let blankedXml = lbsToBlankedXml lbs
      let ibBp = toIbBp64 blankedXml

      hIbOutput <- IO.openFile ibOutput IO.WriteMode
      hBpOutput <- IO.openFile bpOutput IO.WriteMode

      forM_ ibBp $ \(ib, bp) -> do
        BS.hPut hIbOutput ib
        BS.hPut hBpOutput bp

      IO.hClose hIbOutput
      IO.hClose hBpOutput

      return ()
    unknown -> do
      TIO.hPutStrLn IO.stderr $ "Unsupported method: " <> unknown
      IO.exitFailure

optsCreateIndex :: Parser Z.CreateIndexOptions
optsCreateIndex = Z.CreateIndexOptions
  <$> strOption
      (   long "input"
      <>  help "Input file"
      <>  metavar "FILE"
      )
  <*> strOption
      (   long "ib-output"
      <>  help "Interest Bits output"
      <>  metavar "FILE"
      )
  <*> strOption
      (   long "bp-output"
      <>  help "Balanced Parens output"
      <>  metavar "FILE"
      )
  <*> textOption
      (   long "method"
      <>  help "Method"
      <>  metavar "METHOD"
      <>  OA.value "memory"
      )

cmdCreateIndex :: Mod CommandFields (IO ())
cmdCreateIndex = command "create-index"  $ flip info idm $ runCreateIndex <$> optsCreateIndex