--------------------------------------------------------------------------------
-- Copyright © 2011 National Institute of Aerospace / Galois, Inc.
--------------------------------------------------------------------------------

module Copilot.Compile.C99.Test.ReadCSV (iterationsFromCSV) where

import Copilot.Core.Interpret.Eval (Output)
import Copilot.Core.Error (impossible)
import Copilot.Compile.C99.Test.Iteration (Iteration (..))

import Prelude as P
import qualified Data.Vector as V
import qualified Data.ByteString.Char8 as B
import qualified Data.Map as M
import Text.CSV as C

parseError :: a
parseError = impossible "CSV parsing" "copilot-c99"

iterationsFromCSV :: B.ByteString -> [Iteration]
iterationsFromCSV bs =
  case C.parseCSV "csvParseErrors" (B.unpack bs) of
    Left  err -> error (show err)
    Right res -> iterationsFromCSV' res

iterationsFromCSV' :: C.CSV -> [Iteration]
iterationsFromCSV' = map Iteration . go M.empty
  where
  go m []             = [m]
  go m (x:xs)
    | nextIteration x = m : go M.empty xs
    | otherwise =
        let
          m' = M.insert (triggerName x) (triggerOutputs x) m
        in
          go m' xs

nextIteration :: Record -> Bool
nextIteration [x] = x == "#"
nextIteration _   = False

triggerName :: Record -> String
triggerName = head

triggerOutputs :: Record -> [Output]
triggerOutputs = tail