module Data.Histogram.Bin.BinEnum (
BinEnum(..)
, binEnum
, binEnumFull
) where
import Control.Monad (liftM)
import Data.Typeable (Typeable)
import Data.Data (Data)
import Text.Read (Read(..))
import Data.Histogram.Bin.Classes
import Data.Histogram.Bin.BinI
import Data.Histogram.Parse
newtype BinEnum a = BinEnum BinI
deriving (Eq,Data,Typeable,GrowBin)
binEnum :: Enum a => a -> a -> BinEnum a
binEnum a b = BinEnum $ binI (fromEnum a) (fromEnum b)
binEnumFull :: (Enum a, Bounded a) => BinEnum a
binEnumFull = binEnum minBound maxBound
instance Enum a => Bin (BinEnum a) where
type BinValue (BinEnum a) = a
toIndex (BinEnum b) = toIndex b . fromEnum
fromIndex (BinEnum b) = toEnum . fromIndex b
inRange (BinEnum b) = inRange b . fromEnum
nBins (BinEnum b) = nBins b
instance Enum a => IntervalBin (BinEnum a) where
binInterval b x = (n,n) where n = fromIndex b x
instance Enum a => Bin1D (BinEnum a) where
lowerLimit (BinEnum b) = toEnum $ lowerLimit b
upperLimit (BinEnum b) = toEnum $ upperLimit b
unsafeSliceBin i j (BinEnum b) = BinEnum $ unsafeSliceBin i j b
instance Show (BinEnum a) where
show (BinEnum b) = "# BinEnum\n" ++ show b
instance Read (BinEnum a) where
readPrec = keyword "BinEnum" >> liftM BinEnum readPrec