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