# generic-match
[](https://hackage.haskell.org/package/generic-match)
[](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.