module Data.Type.Symbol.Parser
  (
  -- * Base definitions
    Parser
  , Run

  -- * Parsers
  -- ** Combinators
  , Isolate
  , (:<*>:)
  ,  (:*>:)
  , (:<*:)
  , (:<|>:)

  -- ** Primitives
  , Take
  , Drop
  , Literal
  , End

  -- *** Naturals
  , NatDec
  , NatHex
  , NatBin
  , NatOct
  , NatBase
  ) where

import Data.Type.Symbol.Parser.Run
import Data.Type.Symbol.Parser.Types
import Data.Type.Symbol.Parser.Parser.Isolate
import Data.Type.Symbol.Parser.Parser.Drop
import Data.Type.Symbol.Parser.Parser.Natural
import Data.Type.Symbol.Parser.Parser.Then
import Data.Type.Symbol.Parser.Parser.Then.VoidLeft
import Data.Type.Symbol.Parser.Parser.Then.VoidRight
import Data.Type.Symbol.Parser.Parser.Literal
import Data.Type.Symbol.Parser.Parser.End
import Data.Type.Symbol.Parser.Parser.Take
import Data.Type.Symbol.Parser.Parser.Or

-- | Sequence parsers, returning both values in a tuple.
type pl :<*>: pr = Then   pl pr

-- | Sequence parsers, discarding the return value of the left parser
type pl  :*>: pr = ThenVL pl pr

-- | Sequence parsers, discarding the return value of the right parser.
--
-- Consider using ':*>:' instead, which is simpler and potentially faster since
-- we parse L->R.
type pl :<*:  pr = ThenVR pl pr

type pl :<|>: pr = Or pl pr