module Control.Empty where
import qualified Control.Applicative as AP
import Data.Functor.Compose
import qualified Data.Functor.Product as FP
import qualified Data.IntMap as IntMap
import qualified Data.Map as Map
import Data.Proxy
import Data.Semigroup
import qualified Data.Sequence as Seq
import qualified Data.Set as Set
import GHC.Conc
import Text.ParserCombinators.ReadP
import Text.ParserCombinators.ReadPrec
class HasEmpty f where
empty :: forall a. f a
default empty :: AP.Alternative f => f a
empty = AP.empty
instance HasEmpty Maybe
instance HasEmpty []
instance HasEmpty IO
instance HasEmpty STM
instance HasEmpty Proxy
instance HasEmpty Option
instance HasEmpty ReadP
instance HasEmpty ReadPrec
instance (AP.Alternative f, AP.Alternative g) => HasEmpty (FP.Product f g)
instance (AP.Alternative f, AP.Applicative g) => HasEmpty (Compose f g)
instance HasEmpty IntMap.IntMap where empty = mempty
instance HasEmpty (Map.Map k) where empty = Map.empty
instance HasEmpty Seq.Seq where empty = Seq.empty
instance HasEmpty Set.Set where empty = Set.empty
coerce :: HasEmpty f => a -> f b
coerce _ = empty
isEmpty :: (HasEmpty f, Eq (f a)) => f a -> Bool
isEmpty = (== empty)