content: -- | Contains the type of atoms that Common Lisp understands, as
  --   well as the built-in reader macros that Common Lisp provides.
  --   Given a Common Lisp source file that contains no extra reader
  --   macro definitions, this module should successfully parse and
  --   desugar even quoted lists and vector literals.
  module Data.SCargot.CommonLisp
    ( CLAtom (..),
      CommonLispSpec,
      withComments,
      withQuote,
      withVectors,
      decode,
      encode,
    )
  where
  
  data CLAtom
    = CLSymbol Text
    | CLString Text
    | CLInteger Integer
    | CLRatio Integer Integer
    | CLFloat Double
    deriving (Eq, Show, Read)
  
  data CommonLispSpec carrier = CommonLispSpec
    { sexprSpec :: SExprSpec CLAtom carrier,
      octoReaders :: ReaderMacroMap CLAtom
    }
  
  withComments :: CommonLispSpec c -> CommonLispSpec c
  withComments = addCommentType (const () <$> (char ';' *> restOfLine))
  
  withQuote :: CommonLispSpec (SCons CLAtom) -> CommonLispSpec (SCons CLAtom)
  withQuote = addReader '\'' (go <$> parse)
    where
      go v = SCons q (SCons v SNil)
  
  -- | Adds support for the '#(...)' sugar for vectors. (This will be
  --   parsed as '(vector ...)', and
  withVectors :: CommonLispSpec c -> CommonLispSpec c
  withVectors = addReader '#' (go <$> parse)
  
  decode :: CommonLispSpec c -> Text -> Either String c
  encode :: CommonLispSpec c -> c -> Text
  