{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Disco.Exhaustiveness.Possibilities (Possibilities, retSingle, allCombinations, anyOf, none, getPossibilities) where
import Data.Foldable (fold)
newtype Possibilities a = Possibilities {forall a. Possibilities a -> [a]
getPossibilities :: [a]}
deriving (Int -> Possibilities a -> ShowS
[Possibilities a] -> ShowS
Possibilities a -> String
(Int -> Possibilities a -> ShowS)
-> (Possibilities a -> String)
-> ([Possibilities a] -> ShowS)
-> Show (Possibilities a)
forall a. Show a => Int -> Possibilities a -> ShowS
forall a. Show a => [Possibilities a] -> ShowS
forall a. Show a => Possibilities a -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall a. Show a => Int -> Possibilities a -> ShowS
showsPrec :: Int -> Possibilities a -> ShowS
$cshow :: forall a. Show a => Possibilities a -> String
show :: Possibilities a -> String
$cshowList :: forall a. Show a => [Possibilities a] -> ShowS
showList :: [Possibilities a] -> ShowS
Show, Possibilities a -> Possibilities a -> Bool
(Possibilities a -> Possibilities a -> Bool)
-> (Possibilities a -> Possibilities a -> Bool)
-> Eq (Possibilities a)
forall a. Eq a => Possibilities a -> Possibilities a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall a. Eq a => Possibilities a -> Possibilities a -> Bool
== :: Possibilities a -> Possibilities a -> Bool
$c/= :: forall a. Eq a => Possibilities a -> Possibilities a -> Bool
/= :: Possibilities a -> Possibilities a -> Bool
Eq, Eq (Possibilities a)
Eq (Possibilities a) =>
(Possibilities a -> Possibilities a -> Ordering)
-> (Possibilities a -> Possibilities a -> Bool)
-> (Possibilities a -> Possibilities a -> Bool)
-> (Possibilities a -> Possibilities a -> Bool)
-> (Possibilities a -> Possibilities a -> Bool)
-> (Possibilities a -> Possibilities a -> Possibilities a)
-> (Possibilities a -> Possibilities a -> Possibilities a)
-> Ord (Possibilities a)
Possibilities a -> Possibilities a -> Bool
Possibilities a -> Possibilities a -> Ordering
Possibilities a -> Possibilities a -> Possibilities a
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall a. Ord a => Eq (Possibilities a)
forall a. Ord a => Possibilities a -> Possibilities a -> Bool
forall a. Ord a => Possibilities a -> Possibilities a -> Ordering
forall a.
Ord a =>
Possibilities a -> Possibilities a -> Possibilities a
$ccompare :: forall a. Ord a => Possibilities a -> Possibilities a -> Ordering
compare :: Possibilities a -> Possibilities a -> Ordering
$c< :: forall a. Ord a => Possibilities a -> Possibilities a -> Bool
< :: Possibilities a -> Possibilities a -> Bool
$c<= :: forall a. Ord a => Possibilities a -> Possibilities a -> Bool
<= :: Possibilities a -> Possibilities a -> Bool
$c> :: forall a. Ord a => Possibilities a -> Possibilities a -> Bool
> :: Possibilities a -> Possibilities a -> Bool
$c>= :: forall a. Ord a => Possibilities a -> Possibilities a -> Bool
>= :: Possibilities a -> Possibilities a -> Bool
$cmax :: forall a.
Ord a =>
Possibilities a -> Possibilities a -> Possibilities a
max :: Possibilities a -> Possibilities a -> Possibilities a
$cmin :: forall a.
Ord a =>
Possibilities a -> Possibilities a -> Possibilities a
min :: Possibilities a -> Possibilities a -> Possibilities a
Ord, (forall a b. (a -> b) -> Possibilities a -> Possibilities b)
-> (forall a b. a -> Possibilities b -> Possibilities a)
-> Functor Possibilities
forall a b. a -> Possibilities b -> Possibilities a
forall a b. (a -> b) -> Possibilities a -> Possibilities b
forall (f :: * -> *).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
$cfmap :: forall a b. (a -> b) -> Possibilities a -> Possibilities b
fmap :: forall a b. (a -> b) -> Possibilities a -> Possibilities b
$c<$ :: forall a b. a -> Possibilities b -> Possibilities a
<$ :: forall a b. a -> Possibilities b -> Possibilities a
Functor, NonEmpty (Possibilities a) -> Possibilities a
Possibilities a -> Possibilities a -> Possibilities a
(Possibilities a -> Possibilities a -> Possibilities a)
-> (NonEmpty (Possibilities a) -> Possibilities a)
-> (forall b.
Integral b =>
b -> Possibilities a -> Possibilities a)
-> Semigroup (Possibilities a)
forall b. Integral b => b -> Possibilities a -> Possibilities a
forall a. NonEmpty (Possibilities a) -> Possibilities a
forall a. Possibilities a -> Possibilities a -> Possibilities a
forall a.
(a -> a -> a)
-> (NonEmpty a -> a)
-> (forall b. Integral b => b -> a -> a)
-> Semigroup a
forall a b. Integral b => b -> Possibilities a -> Possibilities a
$c<> :: forall a. Possibilities a -> Possibilities a -> Possibilities a
<> :: Possibilities a -> Possibilities a -> Possibilities a
$csconcat :: forall a. NonEmpty (Possibilities a) -> Possibilities a
sconcat :: NonEmpty (Possibilities a) -> Possibilities a
$cstimes :: forall a b. Integral b => b -> Possibilities a -> Possibilities a
stimes :: forall b. Integral b => b -> Possibilities a -> Possibilities a
Semigroup, Semigroup (Possibilities a)
Possibilities a
Semigroup (Possibilities a) =>
Possibilities a
-> (Possibilities a -> Possibilities a -> Possibilities a)
-> ([Possibilities a] -> Possibilities a)
-> Monoid (Possibilities a)
[Possibilities a] -> Possibilities a
Possibilities a -> Possibilities a -> Possibilities a
forall a. Semigroup (Possibilities a)
forall a. Possibilities a
forall a.
Semigroup a =>
a -> (a -> a -> a) -> ([a] -> a) -> Monoid a
forall a. [Possibilities a] -> Possibilities a
forall a. Possibilities a -> Possibilities a -> Possibilities a
$cmempty :: forall a. Possibilities a
mempty :: Possibilities a
$cmappend :: forall a. Possibilities a -> Possibilities a -> Possibilities a
mappend :: Possibilities a -> Possibilities a -> Possibilities a
$cmconcat :: forall a. [Possibilities a] -> Possibilities a
mconcat :: [Possibilities a] -> Possibilities a
Monoid, Functor Possibilities
Functor Possibilities =>
(forall a. a -> Possibilities a)
-> (forall a b.
Possibilities (a -> b) -> Possibilities a -> Possibilities b)
-> (forall a b c.
(a -> b -> c)
-> Possibilities a -> Possibilities b -> Possibilities c)
-> (forall a b.
Possibilities a -> Possibilities b -> Possibilities b)
-> (forall a b.
Possibilities a -> Possibilities b -> Possibilities a)
-> Applicative Possibilities
forall a. a -> Possibilities a
forall a b. Possibilities a -> Possibilities b -> Possibilities a
forall a b. Possibilities a -> Possibilities b -> Possibilities b
forall a b.
Possibilities (a -> b) -> Possibilities a -> Possibilities b
forall a b c.
(a -> b -> c)
-> Possibilities a -> Possibilities b -> Possibilities c
forall (f :: * -> *).
Functor f =>
(forall a. a -> f a)
-> (forall a b. f (a -> b) -> f a -> f b)
-> (forall a b c. (a -> b -> c) -> f a -> f b -> f c)
-> (forall a b. f a -> f b -> f b)
-> (forall a b. f a -> f b -> f a)
-> Applicative f
$cpure :: forall a. a -> Possibilities a
pure :: forall a. a -> Possibilities a
$c<*> :: forall a b.
Possibilities (a -> b) -> Possibilities a -> Possibilities b
<*> :: forall a b.
Possibilities (a -> b) -> Possibilities a -> Possibilities b
$cliftA2 :: forall a b c.
(a -> b -> c)
-> Possibilities a -> Possibilities b -> Possibilities c
liftA2 :: forall a b c.
(a -> b -> c)
-> Possibilities a -> Possibilities b -> Possibilities c
$c*> :: forall a b. Possibilities a -> Possibilities b -> Possibilities b
*> :: forall a b. Possibilities a -> Possibilities b -> Possibilities b
$c<* :: forall a b. Possibilities a -> Possibilities b -> Possibilities a
<* :: forall a b. Possibilities a -> Possibilities b -> Possibilities a
Applicative)
anyOf :: [Possibilities a] -> Possibilities a
anyOf :: forall a. [Possibilities a] -> Possibilities a
anyOf = [Possibilities a] -> Possibilities a
forall m. Monoid m => [m] -> m
forall (t :: * -> *) m. (Foldable t, Monoid m) => t m -> m
fold
none :: Possibilities a -> Bool
none :: forall a. Possibilities a -> Bool
none = [a] -> Bool
forall a. [a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null ([a] -> Bool)
-> (Possibilities a -> [a]) -> Possibilities a -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Possibilities a -> [a]
forall a. Possibilities a -> [a]
getPossibilities
retSingle :: (Monad m) => a -> m (Possibilities a)
retSingle :: forall (m :: * -> *) a. Monad m => a -> m (Possibilities a)
retSingle a
i = Possibilities a -> m (Possibilities a)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (Possibilities a -> m (Possibilities a))
-> Possibilities a -> m (Possibilities a)
forall a b. (a -> b) -> a -> b
$ [a] -> Possibilities a
forall a. [a] -> Possibilities a
Possibilities [a
i]
allCombinations :: [Possibilities a] -> Possibilities [a]
allCombinations :: forall a. [Possibilities a] -> Possibilities [a]
allCombinations = [Possibilities a] -> Possibilities [a]
forall (t :: * -> *) (f :: * -> *) a.
(Traversable t, Applicative f) =>
t (f a) -> f (t a)
forall (f :: * -> *) a. Applicative f => [f a] -> f [a]
sequenceA