content: 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
  -- >   ]
  