-- |
-- Module      :  Data.SExpresso.Parse.Char
-- Copyright   :  © 2019 Vincent Archambault
-- License     :  0BSD
--
-- Maintainer  :  Vincent Archambault <archambault.v@gmail.com>
-- Stability   :  experimental
--
-- The module "Data.SExpresso.Parse" re-exports the functions of this
-- module.

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeFamilies #-}

module Data.SExpresso.Parse.Char
  (
    plainSExprParser
   )
  where

import Text.Megaparsec
import Text.Megaparsec.Char
import Data.SExpresso.Parse.Generic


-- | The function 'plainSExprParser' accepts a parser for atoms and
-- returns a 'SExprParser' for a stream of 'Char' with the following
-- properties :
--
--  * The opening tag is (.
--  * The closing tag is ).
--  * The space parser is 'space1'.
--  * Space is always mandatory between atoms.
plainSExprParser :: (MonadParsec e s m, Token s ~ Char) =>
                    m a -> SExprParser m () a
plainSExprParser :: m a -> SExprParser m () a
plainSExprParser m a
p = m ()
-> (() -> m ())
-> m a
-> m ()
-> (a -> a -> SpacingRule)
-> SExprParser m () a
forall (m :: * -> *) b a c.
m c
-> (c -> m b)
-> m a
-> m ()
-> (a -> a -> SpacingRule)
-> SExprParser m b a
SExprParser
                     (Token s -> m (Token s)
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
Token s
'(' m Char -> m () -> m ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> () -> m ()
forall (m :: * -> *) a. Monad m => a -> m a
return ())
                     (\()
_ -> Token s -> m (Token s)
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
Token s -> m (Token s)
char Char
Token s
')' m Char -> m () -> m ()
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> () -> m ()
forall (m :: * -> *) a. Monad m => a -> m a
return ())
                     m a
p
                     m ()
forall e s (m :: * -> *).
(MonadParsec e s m, Token s ~ Char) =>
m ()
space1
                     a -> a -> SpacingRule
forall a. a -> a -> SpacingRule
spaceIsMandatory