# Nondeterminism
This package is available via [Hackage where its documentation resides](https://hackage.haskell.org/package/nondeterminism).
This provides nondeterministic computations in Haskell. It implements
an `Amb` monad in which you can perform nondeterministic choices along
with a monad transformer version, `AmbT`.
## Amb
An example which finds Pythagorean triplets up to a certain size, project Euler problem 9.
```haskell
import Control.Monad
import Control.Monad.Amb
pyTriple :: (Num t, Ord t) => t -> Amb r (t, t, t)
pyTriple n = do a <- anIntegerBetween 1 n
b <- anIntegerBetween (a + 1) n
c <- anIntegerBetween (b + 1) n
when (a*a + b*b /= c*c) empty
return (a,b,c)
length $ allValues $ pyTriple 100
```
More examples can be found in `tests/test.hs`.
## Future
- allValues is not lazy in its return value