numerical-0.0.0.0: src/Numerical/Array/Locality.hs
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE CPP #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE StandaloneDeriving #-}
module Numerical.Array.Locality(Locality(..),LocalityMax,LocalityMin) where
import Data.Data
data Locality = Contiguous | Strided | InnerContiguous
deriving (Eq,Show,Read,Typeable,Data)
#if defined(__GLASGOW_HASKELL__) && ( __GLASGOW_HASKELL__ >= 707) && ( __GLASGOW_HASKELL__ < 709)
deriving instance Typeable 'Strided
deriving instance Typeable 'InnerContiguous
deriving instance Typeable 'Contiguous
#endif
#if defined(__GLASGOW_HASKELL__) && ( __GLASGOW_HASKELL__ >= 707)
type family LocalityMax (a :: Locality) (b :: Locality) :: Locality where
LocalityMax 'Contiguous 'Contiguous = 'Contiguous
LocalityMax 'Contiguous 'InnerContiguous = 'Contiguous
LocalityMax 'Contiguous 'Strided = 'Contiguous
LocalityMax 'InnerContiguous 'Contiguous = 'Contiguous
LocalityMax 'Strided 'Contiguous = 'Contiguous
LocalityMax 'InnerContiguous 'InnerContiguous = 'InnerContiguous
LocalityMax 'InnerContiguous 'Strided = 'InnerContiguous
LocalityMax 'Strided 'InnerContiguous = 'InnerContiguous
LocalityMax 'Strided 'Strided = 'Strided
type family LocalityMin (a::Locality) (b ::Locality) :: Locality where
LocalityMin 'Contiguous 'Contiguous = 'Contiguous
LocalityMin 'Contiguous 'InnerContiguous = 'InnerContiguous
LocalityMin 'Contiguous 'Strided = 'Strided
LocalityMin 'InnerContiguous 'Contiguous = 'InnerContiguous
LocalityMin 'Strided 'Contiguous = 'Strided
LocalityMin 'InnerContiguous 'InnerContiguous = 'InnerContiguous
LocalityMin 'InnerContiguous 'Strided = 'Strided
LocalityMin 'Strided 'InnerContiguous = 'Strided
LocalityMin 'Strided 'Strided = 'Strided
#else
type family LocalityMax (a :: Locality) (b :: Locality) :: Locality
type instance LocalityMax a b = LocalityMaxPrivate a b
type family LocalityMaxPrivate (a :: Locality) (b :: Locality) :: Locality
type instance LocalityMaxPrivate 'Contiguous 'Contiguous = 'Contiguous
type instance LocalityMaxPrivate 'Contiguous 'InnerContiguous = 'Contiguous
type instance LocalityMaxPrivate 'Contiguous 'Strided = 'Contiguous
type instance LocalityMaxPrivate 'InnerContiguous 'Contiguous = 'Contiguous
type instance LocalityMaxPrivate 'Strided 'Contiguous = 'Contiguous
type instance LocalityMaxPrivate 'InnerContiguous 'InnerContiguous = 'InnerContiguous
type instance LocalityMaxPrivate 'InnerContiguous 'Strided = 'InnerContiguous
type instance LocalityMaxPrivate 'Strided 'InnerContiguous = 'InnerContiguous
type instance LocalityMaxPrivate 'Strided 'Strided = 'Strided
type family LocalityMin (a::Locality) (b ::Locality) :: Locality
type instance LocalityMin a b = LocalityMinPrivate a b
type family LocalityMinPrivate (a::Locality) (b ::Locality) :: Locality
type instance LocalityMinPrivate 'Contiguous 'Contiguous = 'Contiguous
type instance LocalityMinPrivate 'Contiguous 'InnerContiguous = 'InnerContiguous
type instance LocalityMinPrivate 'Contiguous 'Strided = 'Strided
type instance LocalityMinPrivate 'InnerContiguous 'Contiguous = 'InnerContiguous
type instance LocalityMinPrivate 'Strided 'Contiguous = 'Strided
type instance LocalityMinPrivate 'InnerContiguous 'InnerContiguous = 'InnerContiguous
type instance LocalityMinPrivate 'InnerContiguous 'Strided = 'Strided
type instance LocalityMinPrivate 'Strided 'InnerContiguous = 'Strided
type instance LocalityMinPrivate 'Strided 'Strided = 'Strided
#endif