packages feed

hw-rankselect-0.13.2.0: app/App/Commands/Build.hs

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

module App.Commands.Build
  ( cmdBuild
  ) where

import Control.Lens
import Control.Monad
import Data.Generics.Product.Any
import Data.List
import Data.Monoid                         ((<>))
import HaskellWorks.Data.FromForeignRegion
import Options.Applicative
import System.Directory

import qualified App.Commands.Options.Type                            as Z
import qualified HaskellWorks.Data.RankSelect.CsPoppy                 as CS
import qualified HaskellWorks.Data.RankSelect.CsPoppy.Internal.Alpha1 as A1
import qualified HaskellWorks.Data.RankSelect.Poppy512                as P512

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

runBuild :: Z.BuildOptions -> IO ()
runBuild opts = case opts ^. the @"indexType" of
  Z.CsPoppy  -> do
    entries <- getDirectoryContents "data"
    let files = ("data/" ++) <$> (".ib" `isSuffixOf`) `filter` entries
    forM_ files $ \file -> do
      putStrLn $ "Loading cspoppy for " <> file
      CS.CsPoppy !_ !_ (A1.CsPoppyIndex !_ !_) <- mmapFromForeignRegion file
      return ()
  Z.Poppy512 -> do
    entries <- getDirectoryContents "data"
    let files = ("data/" ++) <$> (".ib" `isSuffixOf`) `filter` entries
    forM_ files $ \file -> do
      putStrLn $ "Loading cspoppy for " <> file
      P512.Poppy512 !_ !_ <- mmapFromForeignRegion file
      return ()

optsBuild :: Parser Z.BuildOptions
optsBuild = Z.BuildOptions
  <$> option auto
      (   long "index-type"
      <>  help "Index type"
      <>  metavar "INDEX_TYPE"
      )

cmdBuild :: Mod CommandFields (IO ())
cmdBuild = command "build"  $ flip info idm $ runBuild <$> optsBuild