{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE DeriveFunctor, DeriveGeneric, DeriveFunctor #-}
{-# LANGUAGE DeriveFoldable,DeriveTraversable #-}
module Numerical.Array.Range (
Range(..)
,AffineRange(..)
,HasRange(..)
,affineRangeStride) where
import Data.Data
import GHC.Generics
#if defined(__GLASGOW_HASKELL__) && __GLASGOW_HASKELL__ < 709
import Data.Foldable
import Data.Traversable
#endif
data Range a =Range {_RangeMin :: !a
,_RangeMax :: !a}
deriving (Eq,Show,Data,Typeable,Generic ,Foldable,Traversable,Functor)
class HasRange r a | r -> a where
rangeMin:: Functor f => (a -> f a )-> r -> f r
rangeMax:: Functor f => (a -> f a )-> r -> f r
instance HasRange (Range a) a where
rangeMax = _rangeMax
{-# INLINE rangeMax#-}
rangeMin = _rangeMin
{-# INLINE rangeMin #-}
instance HasRange (AffineRange a) a where
rangeMin = _affineRangeMin
{-# INLINE rangeMin #-}
rangeMax = _affineRangeMax
{-# INLINE rangeMax #-}
_rangeMin :: Functor f => (a -> f a)-> Range a -> f (Range a)
_rangeMin = \ fun rec -> fmap (\mup -> rec{_RangeMin= mup}) $ fun (_RangeMin rec )
{-# INLINE _rangeMin#-}
_rangeMax :: Functor f => (a -> f a) -> Range a -> f (Range a)
_rangeMax = \ fun rec -> fmap (\mup -> rec{_RangeMax= mup}) $ fun (_RangeMax rec )
{-# INLINE _rangeMax #-}
data AffineRange a = AffineRange{_AffineRangeMin :: !a
,_AffineRangeStride :: ! Int
,_AffineRangeMax :: !a}
deriving (Eq,Show,Data,Generic,Typeable,Functor,Foldable,Traversable )
_affineRangeMin :: Functor f => (a-> f a) -> AffineRange a -> f (AffineRange a)
_affineRangeMin= \ fun rec -> fmap (\mup -> rec{_AffineRangeMin=mup}) $ fun (_AffineRangeMin rec)
{-# INLINE _affineRangeMin#-}
_affineRangeMax :: Functor f => (a -> f a) -> AffineRange a -> f (AffineRange a)
_affineRangeMax= \ fun rec -> fmap (\mup -> rec{_AffineRangeMax=mup}) $ fun (_AffineRangeMax rec)
{-# INLINE _affineRangeMax #-}
affineRangeStride :: Functor f => (Int -> f Int) -> AffineRange a -> f (AffineRange a)
affineRangeStride = \fun rec -> fmap (\mup -> rec{_AffineRangeStride=mup}) $ fun (_AffineRangeStride rec)
{-# INLINE affineRangeStride #-}