module Data.SCargot
  ( -- * SCargot Basics

    -- $intro

    -- * Parsing and Printing
    decode
  , decodeOne
  , encode
  , encodeOne
    -- * Parser Construction
    -- ** Specifying a Parser
  , SExprParser
  , Reader
  , Comment
  , mkParser
  , setCarrier
  , addReader
  , setComment
  , asRich
  , asWellFormed
  , withQuote
    -- * Printer Construction
    -- * Specifying a Pretty-Printer
  , SExprPrinter
  , Indent(..)
  , basicPrint
  , flatPrint
  , unconstrainedPrint
  , setFromCarrier
  , setMaxWidth
  , removeMaxWidth
  , setIndentAmount
  , setIndentStrategy
  ) where

import Data.SCargot.Parse
import Data.SCargot.Print

{- $intro

The S-Cargot library is a library for parsing and emitting
<https://en.wikipedia.org/wiki/S-expression s-expressions>, designed
to be as flexible as possible. Despite some efforts at
<http://people.csail.mit.edu/rivest/Sexp.txt standardization>,
s-expressions are a general approach to describing a data format
that can very often differ in subtle, incompatible ways: the
s-expressions understood by Common Lisp are different from the
s-expressions understood by Scheme, and even the different
revisions of the Scheme language understand s-expressions in a
slightly different way. To accomodate this, the S-Cargot library
provides a toolbox for defining variations on s-expressions,
complete with the ability to select various comment syntaxes, reader
macros, and atom types.

If all you want is to read some s-expressions and don't care about
the edge cases of the format, or all you want is a new configuration
format, try the "Data.SCargot.Language.Basic" or "Data.SCargot.Language.HaskLike"
modules, which define an s-expression language whose atoms are
plain strings and Haskell literals, respectively.

The S-Cargot library works by specifying values which contain all
the information needed to either parse or print an s-expression.
The actual s-expression structure is parsed as a structure of
<https://en.wikipedia.org/wiki/Cons cons cells> as represented
by the 'SExpr' type, but can alternately be exposed as the
isomorphic 'RichSExpr' type or the less expressive but
easier-to-work-with 'WellFormedSExpr' type. Modules devoted
to each representation type (in "Data.SCargot.Repr.Basic",
"Data.SCargot.Repr.Rich", and "Data.SCargot.Repr.WellFormed")
provide helper functions, lenses, and pattern synonyms to make
creating and processing these values easier.

The details of how to parse a given structure are represented
by building up a 'SExprParser' value, which is defined in
"Data.SCargot.Parse" and re-exported here. A minimal
'SExprParser' defines only how to parse the atoms of the
language; helper functions can define comment syntaxes,
reader macros, and transformations over the parsed structure.

The details of how to print a given structure are represented
by building up a 'SExprPrinter' value, which is defined in
"Data.SCargot.Print" and re-exported here. A minimal
'SExprPrinter' defines only how to print the atoms of the
language; helper functions help with the layout of the
pretty-printed s-expression in terms of how to indent the
surrounding expression.

Other helper modules define useful primitives for building up
s-expression languages: the "Data.SCargot.Common" module provides
parsers for common literals, while the "Data.SCargot.Comments"
module provides parsers for comment syntaxes borrowed from
various other languages.

-}