module Data.SCargot.Atom ( -- $intro atom , mkAtomParser ) where import Data.SCargot.Parse (SExprParser, mkParser) import Data.SCargot.Repr (SExpr) import Text.Parsec (choice) import Text.Parsec.Text (Parser) -- | A convenience function for defining an atom parser from a wrapper -- function and a parser. This is identical to 'fmap' specialized to -- operate over 'Parser' values, and is provided as sugar. atom :: (t -> atom) -> Parser t -> Parser atom atom = fmap -- | A convenience function for defining a 'SExprSpec' from a list of -- possible atom parsers, which will be tried in sequence before failing. mkAtomParser :: [Parser atom] -> SExprParser atom (SExpr atom) mkAtomParser = mkParser . choice {- $intro This module defines small convenience functions for building an atom type from several individual parsers. This is easy to do without these functions, but these functions communicate intent more directly: > data Atom > = Ident Text > | Num Integer > > myParser :: SExprParser Atom (SExpr Atom) > myParser = mkAtomParser > [ atom Ident parseR7RSIdent > , atom Num signedDecNumber > ] -}