{-|
Module      : Data.JustParse
Description : The one-stop import for the library
Copyright   : Copyright Waived
License     : PublicDomain
Maintainer  : grantslatton@gmail.com
Stability   : experimental
Portability : portable

A simple and comprehensive Haskell parsing library.
-} 

{-# LANGUAGE Safe #-}
module Data.JustParse (
    -- * Overview
    -- $overview

    -- * Quickstart Examples
    -- *** Simple char and string parsing
    -- $quickstart1

    -- *** Basic combinatorial parsing
    -- $quickstart2

    -- *** Recursive combinatorial parsing
    -- $quickstart3

    -- * General Parsing
    C.Stream(..),
    C.Result(..),
    C.Parser( parse ),
    C.justParse,
    C.runParser,
    C.finalize,
    C.extend,
    C.isDone,
    C.isFail,
    C.isPartial,
    C.rename,
    (C.<?>),

    -- * Generic Parsers
    C.test,
    C.greedy,
    C.option,
    C.satisfy,
    C.mN,
    C.many,
    C.many1,
    C.manyN,
    C.atLeast,
    C.exactly,
    C.eof,
    C.oneOf,
    C.noneOf,
    C.anyToken,
    C.lookAhead,

    -- * Char Parsers
    C.char,
    C.anyChar,
    C.ascii,
    C.latin1,
    C.control,
    C.space,
    C.lower,
    C.upper,
    C.alpha,
    C.alphaNum,
    C.print,
    C.digit,
    C.octDigit,
    C.hexDigit,
    C.eol,

    -- * String Parsers
    C.string,

    -- * Regex Parsers
    L.regex,
    L.regex',
    L.Match(..)

) where

import Data.JustParse.Language as L
import Data.JustParse.Common as C

-- $overview
-- 
-- * Allows for parsing arbitrary 'Stream' types
-- 
-- * Makes extensive use of combinators
-- 
-- * Returns relatively verbose 'Fail'ure messages.
-- 
-- * Allows one to 'rename' a 'Parser'. 
-- 
-- * Allows for a parser to return a 'Partial' 'Result'
-- 
-- * Non-greedy parsing
-- 
-- * Returns a list of all possible parses
-- 
-- * Allows for conversion of a 'regex' to a parser

-- $quickstart1
--
-- This parser will only accept the string @\"hello world\"@
--
-- @
--p = do                
--    h \<- char \'h\'                   \-\-Parses the character \'h\'
--    rest \<- string \"ello world\"     \-\-Parses the string \"ello world\"
--    exp \<- char \'!\'                 \-\-Parses the character \'!\'
--    return ([h]++rest++[exp])       \-\-Returns all of the above concatenated together
-- @

-- $quickstart2
--
-- This parser will accept the string @\"hello woooooorld\"@ with any number of @o@\'s.
-- It returns the number of @o@\'s.
--
-- @
--p = do
--    first \<- string \"hello w\"         \-\-Parses the string \"hello w\"
--    os \<- many1 (char \'o\')            \-\-Applies the parser \"char \'o\'\" one or more times
--    second \<- string \"rld\"            \-\-Parses the string \"rld\"
--    return (length os)                \-\-Return the number of o\'s parsed
-- @

-- $quickstart3
-- 
-- This parser will turn a string of comma separated values into a list of them
--
-- @
--csv = do  
--    v \<- greedy (many (noneOf \",\"))       \-\-Parses as many non-comma characters as possible
--    vs \<- option [] (char \',\' >> csv)     \-\-Optionally parses a comma and a csv, returning the empty list upon failure
--    return (v:vs)                         \-\-Concatenates and returns the full list
-- @