isbn: ISBN Validation and Manipulation
======================================

All books published by major publishers since 1970 have an International Standard Book Number (ISBN) associated with them. Prior to 2007, all ISBNs issued were ten digit ISBN-10 format. Since 2007, new ISBNs have been issued in the thirteen digit ISBN-13 format. See the [ISBN Wikipedia article](https://en.wikipedia.org/wiki/International_Standard_Book_Number) for more information.

## Overview

This library provides data types and functions both validating and working with ISBNs. For general use, only importing the `Data.ISBN` module is required, as it reexports all functionality for validating and converting between ISBN-10 and ISBN-13 values. The specific implementations for validation are located in the `Data.ISBN.ISBN10` and `Data.ISBN.ISBN13` modules, respectively.

## Usage Example: Validating an ISBN and printing the error

```haskell
import Data.ISBN (ISBN, validateISBN, renderISBNValidationError)

validateUserSuppliedISBN :: Text -> Either Text ISBN
validateUserSuppliedISBN userIsbnInput =
    either (Left . renderISBNValidationError) Right (validateISBN userIsbnInput)


someValidISBN10 =
    validateUserSuppliedISBN "0345816021"    -- Right (ISBN10 "0345816021")

someValidISBN13 =
    validateUserSuppliedISBN "9780807014295" -- Right (ISBN13 "9780807014295")

tooShortISBN =
    validateUserSuppliedISBN "0-345-816"     -- Left "An ISBN must be 10 or 13 characters, not counting hyphens"

invalidISBN10 =
    validateUserSuppliedISBN "0-345-81602-3" -- Left "The supplied ISBN-10 is not valid"
```


## Development

This library is developed using a [Nix](https://nixos.org/nix/) shell. The environment is specified in `shell.nix`. You can enter the environment with `nix` installed via `nix-shell`. The `nix-shell` will install sandboxed copies of `cabal-install`, `ghcid`, `entr`, and `gnumake`, which are the utilities necessary to build the project, run the tests, and create a local copy of the documentation.

#### Entering the development environment and runnning tests

```
$ cd <path-to-repo>
$ nix-shell                       # assumes `nix` is installed
(nix-shell) $ make help           # show all of the make targets
(nix-shell) $ make tests-watch    # build the library and run the tests in `ghcid`
(nix-shell) $ make docs           # build a local copy of the haddock documentation
```