packages feed

caseof-0.0.0: README.md

# caseof

A simple way to query constructors, like cases but slightly more
concise.

Aimed at sum types with many constructors:

``` haskell
data Wiggle = Woo Int Char | Wibble Int deriving Show
```

There is a case predicate:

``` haskell
> $(isCaseOf 'Woo) (Woo 5 'a')
True
```

There is a `Maybe`-based matcher:

``` haskell
> $(maybeCaseOf 'Woo) (Woo 1 'a')
Just (1,'a')
```

There is a combinator which calls your function with n arguments, or
passes the whole value to an "else" clause.

``` haskell
> $(caseOf 'Woo) (\x y -> show x ++ show y) (const "") (Wibble 5)
""
```

This allows them to be nested:

```haskell
> $(caseOf 'Woo) (\x y -> show x ++ show y) (const "") (Woo 5 'a')
"5'a'"
> $(caseOf 'Woo) (\x y -> show x ++ show y) ($(caseOf 'Wibble) show (const "")) (Woo 5 'a')
"5'a'"
```

What's the point of `caseOf`? To more easily dispatch on functions:

```haskell
handleHuman name age = ...
handleMachine id = ..
handleWithDefault def =
   $(caseOf 'Human) handleHuman .
   $(caseOf 'Machine) handleMachine def
```

This applies to any kind of "case" that you'd like to refactor into a function.

## Use in your project

In your stack.yaml, put:

```
extra-deps:
- git: https://github.com/chrisdone/caseof.git
  commit: 9a7f6bb
```