module HOPS.DB
( DB (..)
, readSeqDB
, readANumDB
, emptyANumDB
) where
import GHC.TypeLits
import Data.Proxy
import Data.Vector (Vector, (//))
import qualified Data.Vector as V
import Data.ByteString (ByteString)
import qualified Data.ByteString.Char8 as B
import System.Directory
import HOPS.GF.Series
import HOPS.OEIS
import HOPS.Config
import Paths_hops
newtype DB = DB {unDB :: ByteString} deriving Show
readDB :: FilePath -> IO DB
readDB fpath = doesFileExist fpath >>= \b ->
DB <$> (B.readFile =<< if b then return fpath
else getDataFileName "data/stub.db")
readSeqDB :: Config -> IO DB
readSeqDB = readDB . seqDBPath
readANumDB :: KnownNat n => Config -> IO (Vector (Series n))
readANumDB cfg = do
entries <- parseStripped . unDB <$> readSeqDB cfg
let series' = series (Proxy :: Proxy n) . map Val
let pairs = [ (unANum a 1, series' s) | (a, s) <- entries ]
return $ V.replicate 350000 (series' []) // pairs
emptyANumDB :: Vector (Series n)
emptyANumDB = V.empty