: FilePath → IO (Maybe [Decision])
readDecisionFile file = do
  fileContents ← decodeLatin1 . stripBoM . BS.toStrict <$> readFile file
  parseResult ← case statefulParseOnly (sep *> many' value) (initialPos file) fileContents of
    Right x → return x
    Left e → trace ("Parse failed in " <> file) $ return []
  let decisions = map (runMaker decisionClass) parseResult
  mapM_ (printErrors file) decisions
  return $ if isRight $ sequence decisions
           then Just $ concat $ rights decisions
           else mempty

readFiles :: (FilePath → I
readDecisionFile :: FilePath → IO (Maybe [Decision])
readDecisionFile file = do
  fileContents ← decodeLatin1 . stripBoM . BS.toStrict <$> readFile file
  parseResult ← case statefulParseOnly (sep *> many' value) (initialPos file) fileContents of
    Right x → return x
    Left e → trace ("Parse failed in " <> file) $ return []
  let decisions = map (runMaker decisionClass) parseResult
  mapM_ (printErrors file) decisions
  return $ if isRight $ sequence decisions
           then Just $ concat $ rights decisions
           else mempty
readDecisionFile file = do
  fileContents ← decodeLatin1 . stripBoM . BS.toStrict <$> readFile file
  parseResult ← case statefulParseOnly (sep *> many' value) (initialPos file) fileContents of
    Right x → return x
    Left e → trace ("Parse failed in " <> file) $ return []
  let decisions = map (runMaker decisionClass) parseResult
  mapM_ (printErrors file) decisions
  return $ if isRight $ sequence decisions
           then Just $ concat $ rights decisions
           else mempty