singletons-0.10.0: src/Data/Singletons/Void.hs
{- Data/Singletons/Void.hs
A reimplementation of a Void type, copied shamelessly from Edward Kmett's void
package, but without inducing a dependency.
-}
{-# LANGUAGE CPP, Trustworthy, DeriveDataTypeable, DeriveGeneric, StandaloneDeriving #-}
-----------------------------------------------------------------------------
-- |
-- Copyright : (C) 2008-2013 Edward Kmett
-- License : BSD-style (see LICENSE)
-- Maintainer : Richard Eisenberg (eir@cis.upenn.edu)
-- Stability : experimental
-- Portability : non-portable
--
-- This module is a reimplementation of Edward Kmett's @void@ package.
-- It is included within singletons to avoid depending on @void@ and all the
-- packages that depends on (including @text@). If this causes problems for
-- you (that singletons has its own 'Void' type), please let me (Richard Eisenberg)
-- know at @eir@ at @cis.upenn.edu@.
--
----------------------------------------------------------------------------
module Data.Singletons.Void
( Void
, absurd
, vacuous
, vacuousM
) where
import Control.Monad (liftM)
import Data.Ix
import Data.Data
import GHC.Generics
import Control.Exception
-- | A logically uninhabited data type.
newtype Void = Void Void
deriving (Data, Typeable, Generic)
instance Eq Void where
_ == _ = True
instance Ord Void where
compare _ _ = EQ
instance Show Void where
showsPrec _ = absurd
-- | Reading a 'Void' value is always a parse error, considering 'Void' as
-- a data type with no constructors.
instance Read Void where
readsPrec _ _ = []
-- | Since 'Void' values logically don't exist, this witnesses the logical
-- reasoning tool of \"ex falso quodlibet\".
absurd :: Void -> a
absurd a = a `seq` spin a where
spin (Void b) = spin b
-- | If 'Void' is uninhabited then any 'Functor' that holds only values of type 'Void'
-- is holding no values.
vacuous :: Functor f => f Void -> f a
vacuous = fmap absurd
-- | If 'Void' is uninhabited then any 'Monad' that holds values of type 'Void'
-- is holding no values.
vacuousM :: Monad m => m Void -> m a
vacuousM = liftM absurd
instance Ix Void where
range _ = []
index _ = absurd
inRange _ = absurd
rangeSize _ = 0
instance Exception Void