content: 
  
  {-# 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
  
  
  
  
  
  