{- Load
Gregory W. Schwartz

Collects the functions pertaining to loading the data frame from rows of a file.
-}

{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE OverloadedStrings #-}

module Statistics.Load
    ( loadNamedEntities
    ) where

-- Standard
import Data.List (sort)
import qualified Data.Foldable as F
import qualified Data.Map.Strict as Map
import qualified Data.Sequence as Seq
import qualified Data.Text as T
import qualified Data.Text.Read as T
import qualified Data.Vector as V

-- Cabal

-- Local
import Statistics.Types

-- | Load entities from a list of rows.
loadNamedEntities :: V.Vector (Map.Map T.Text T.Text) -> [NamedEntity]
loadNamedEntities = fmap (uncurry NamedEntity)
                  . Map.toAscList
                  . Map.map (fmap snd . sort . F.toList)
                  . Map.fromListWith (Seq.><)
                  . fmap lookupInfo
                  . V.toList
  where
    lookupErr x = Map.findWithDefault (error $ "Missing column: " <> show x) x
    lookupInfo m =
      ( Name $ lookupErr "name" m
      , Seq.singleton ( lookupErr "replicate" m
                      , either error fst . T.double $ lookupErr "value" m
                      )
      )