packages feed

bookhound-0.1.3.0: src/Parsers/Collections.hs

module Parsers.Collections (collOf, listOf, tupleOf, mapOf, csvOf) where

import Parser (Parser)
import ParserCombinators ((|*), (|?), maybeWithin)
import Parsers.Char (comma, openSquare, closeSquare, openParens,
                     closeParens, openCurly, closeCurly)
import Parsers.String(spacing)

import qualified Data.Foldable as Foldable
import qualified Data.Map as Map
import Data.Map(Map)


collOf :: Parser a -> Parser b -> Parser c -> Parser d -> Parser [d]
collOf sep start end elemParser = do start
                                     elems <- ((maybeWithin spacing $ elemParser <* sep) |*)
                                     element  <- maybeWithin spacing (elemParser |?)
                                     end
                                     pure (elems ++ Foldable.toList element)


listOf :: Parser a -> Parser [a]
listOf = collOf comma openSquare closeSquare

tupleOf :: Parser a -> Parser [a]
tupleOf = collOf comma openParens closeParens

mapOf :: Ord b => Parser a -> Parser b -> Parser c -> Parser (Map b c)
mapOf sep p1 p2 = Map.fromList <$> collOf comma openCurly closeCurly mapEntry  where

  mapEntry = do key <- p1
                maybeWithin spacing sep
                value <- p2
                pure (key, value)

csvOf :: Parser a -> Parser [a]
csvOf = collOf comma (pure ()) (pure ())