parseLog :: FilePath -> IO (Either String (V.Vector Benchmark))
parseLog p = do
   file <- BS.readFile p
   let (hdr, csv) = splitHeader file delimiter
   timezone <- getCurrentTimeZone
   case (getEpochTime hdr) of
      Nothing -> return $ Left "missing timestamp!"
      Just ts -> case (decode HasHeader csv) of
         Right bm ->
            return $ Right $ fmap
               (\a -> a {benchTimestamp = utcToLocalTime
                                             timezone
                                             $ posixSecondsToUTCTime
                                               $ realToFrac ts})
               bm
parseLog :: FilePath -> IO (Either String (V.Vector Benchmark))
parseLog p = do
   file <- BS.readFile p
   let (hdr, csv) = splitHeader file delimiter
   timezone <- getCurrentTimeZone
   case (getEpochTime hdr) of
      Nothing -> return $ Left "missing timestamp!"
      Just ts -> case (decode HasHeader csv) of
         Right bm ->
            return $ Right $ fmap
               (\a -> a {benchTimestamp = utcToLocalTime
                                             timezone
                                             $ posixSecondsToUTCTime
                                               $ realToFrac ts})
               bm
parseLog p = do
   file <- BS.readFile p
   let (hdr, csv) = splitHeader file delimiter
   timezone <- getCurrentTimeZone
   case (getEpochTime hdr) of
      Nothing -> return $ Left "missing timestamp!"
      Just ts -> case (decode HasHeader csv) of
         Right bm ->
            return $ Right $ fmap
               (\a -> a {benchTimestamp = utcToLocalTime
                                             timezone
                                             $ posixSecondsToUTCTime
                                               $ realToFrac ts})
               bm