# symbol-parser Type level string (`Symbol`) parser combinators with nice error messages. This library is effectively made possible by `UnconsSymbol :: Symbol -> Maybe (Char, Symbol)` introduced in GHC 9.2. A big thank you to all GHC developers!!! ## Examples ```haskell ghci> import Data.Type.Symbol.Parser ghci> :k! RunParser (Drop 3 :*>: Isolate 2 NatDec :<*>: (Drop 3 :*>: NatHex)) "___10___FF" ... = Right '( '(10, 255), "") ``` ## Design [defun-core-hackage]: https://hackage.haskell.org/package/defun-core ```haskell type Parser s r = Char -> s -> Result s r data Result s r = Cont s | Done r | Err ErrorMessage ``` `Symbol`s are parsed `Char` by `Char`. For each `Char`, the parser is called with the `Char` in question and the current parser state. Parsing continues based on the result. We pass parsers around via defunctionalization symbols. The plumbing here is provided by Oleg's fantastic [defun-core][hackage-defun-core]. I try to keep the internals as simple as possible. Hopefully, this library looks like any other parser combinator, except reflected up to the type level. ## Why? Via `GHC.Generics`, we may inspect Haskell data types on the type level. Constructor names are `Symbols`. Ever reify these, then perform some sort of checking or parsing on the term level? Now you can do it on the type level instead. Catch bugs earlier, get faster runtime. ## I want to help I would gladly accept further combinators or other suggestions. Please add an issue or pull request, or contact me via email or whatever (I'm raehik everywhere). ## License Provided under the MIT license. See `LICENSE` for license text.