analyze-0.1.0.0: src/Analyze/Conversions.hs
-- | Simple structural conversions.
module Analyze.Conversions
( projectRow
, projectRows
) where
import Analyze.Common (Data, MissingKeyError (..), makeLookup)
import Analyze.RFrame (RFrame (..), RFrameUpdate (..), fromUpdate)
import Control.Monad.Catch (MonadThrow (..))
import Data.HashMap.Strict (HashMap)
import qualified Data.HashMap.Strict as HM
import Data.Vector (Vector)
import qualified Data.Vector as V
-- | Projects values out of the map according to the given key order.
projectRow :: (Data k, MonadThrow m) => Vector k -> HashMap k v -> m (Vector v)
projectRow ks row = V.mapM f ks
where
f k =
case HM.lookup k row of
Nothing -> throwM (MissingKeyError k)
Just v -> pure v
-- | Projects an 'RFrame' out of many maps according to the given key order.
projectRows :: (Data k, MonadThrow m) => Vector k -> Vector (HashMap k v) -> m (RFrame k v)
projectRows ks rs = do
vs <- V.mapM (projectRow ks) rs
fromUpdate (RFrameUpdate ks vs)