packages feed

hanalyze-0.1.0.0: src/Hanalyze/DataIO/External.hs

{-# LANGUAGE OverloadedStrings #-}
-- | External data-format loaders (Parquet / JSON) via the Hackage
-- @dataframe@ library.
--
-- Returns Hackage's 'DataFrame.Internal.DataFrame.DataFrame' directly.
-- For CSV and TSV use 'Hanalyze.DataIO.CSV.loadCSV' / @loadTSV@ instead.
module Hanalyze.DataIO.External
  ( loadParquet
  , loadJSON
  ) where

import qualified DataFrame                    as DX
import qualified DataFrame.Internal.DataFrame as DXD
import qualified DataFrame.IO.JSON            as DXJ

import Control.Exception (SomeException, try)

-- | Load an Apache Parquet file (columnar, supports compression).
loadParquet :: FilePath -> IO (Either String DXD.DataFrame)
loadParquet = loadRaw DX.readParquet

-- | Load a JSON file in records-of-objects format.
loadJSON :: FilePath -> IO (Either String DXD.DataFrame)
loadJSON = loadRaw DXJ.readJSON

loadRaw :: (FilePath -> IO DXD.DataFrame)
        -> FilePath -> IO (Either String DXD.DataFrame)
loadRaw reader path = do
  result <- try (reader path) :: IO (Either SomeException DXD.DataFrame)
  return $ case result of
    Left  e  -> Left ("External loader failed: " ++ show e)
    Right df -> Right df