validated-literals: Compile-time checking for partial smart-constructors
================================================================
[](https://en.wikipedia.org/wiki/BSD_License)
[](https://hackage.haskell.org/package/validated-literals)
[](https://matrix.hackage.haskell.org/#/package/validated-literals)
[](https://travis-ci.org/merijn/validated-literals)
To disallow invalid input it is common to define (new)types with hidden data
constructors. Forcing the user to go through a smart-constructor that enforces
invariants and returns `Maybe ResultType`, preventing the construction of data
with invalid values.
However, it is __also__ common to want to include literal values of such types
in source text. Things of textual literals for HTML, HTTP, etc. In such cases
smart-constructors force us to handle potential conversion failures at runtime,
or abusing functions like `fromJust` to break away all the safety
smart-constructors provide. All this despite the fact that we can statically
know at compile time that the conversion will always succeed or always fails.
This package provides a typeclasses for using TH to validate the correctness of
provided literals at compile. This lets you define, e.g., `newtype Even = Even
Integer` and write:
```
x :: Even
x = $$(valid 38)
```
This will check, at compile time, that the provided `Integer` is, in fact, even
and unwrap it from `Maybe`, avoiding the runtime check.