packages feed

generic-match-0.3.0.0: README.md

# generic-match

[![Hackage](https://img.shields.io/hackage/v/generic-match.svg)](https://hackage.haskell.org/package/generic-match)
[![Build Status](https://travis-ci.org/SamuelSchlesinger/generic-match.svg?branch=master)](https://travis-ci.org/SamuelSchlesinger/generic-match)

## What?
An implementation of first-class pattern matches in Haskell, based on [generics-sop](https://hackage.haskell.org/package/generics-sop).

## Why?
Oftentimes, when writing Haskell code, we want to branch on multiple cases of
a sum type, such as

```haskell
data TravelMethod
  = Airplane Airport UTCTime
  | Train TrainStation UTCTime
  | Driving
```

For instance, lets say that we want to grab out the time. In Haskell, we can
do this by writing:

```haskell
timeOfTravel :: TravelMethod -> Maybe UTCTime
timeOfTravel = \case
  Airplane _airport time -> Just time
  Train _trainStation time -> Just time
  Driving -> Nothing
```

This is concise, and preferable to many other languages, but in this case we
can do even better using this library.

```haskell
timeOfTravel travelMethod = match travelMethod (Just . flip const) (Just . flip const) Nothing
```

In this example, perhaps we don't save much, but I hope the principle is clear.
The case for using this library is when you want to branch on the contents of
each different sum, and you _already_ have functions or concise combinators to
build functions that handle your inputs. For a Haskeller, this is already
rather familiar, I claim!

```haskell
either l r x == match x l r
maybe n j x == match x n j
```

## Examples

```haskell
data DatabaseAccess a =
    ConnectionFailure String
  | InvalidRowCount Int
  | Successful a
  deriving (GHC.Generic, Generic)

doThing :: m (DatabaseAccess Bool)

...

x <- doThing >>= \g -> match g error (error . show) pure
```

## Contribution

Contributions are very welcome! Feel free to create an issue or a PR or
ping me on any platform to chat about whatever, especially improvements to my
libraries.

## Compatibility

I support all of the GHC versions that I typically do in my code, from 8.6.1
to 8.10.2. I build locally on Mac, and my travis builds are on Linux, so
if you run into problems on Windows, let me know. If you want to be sure that
a build will pass, run the test script in this repository.