module Data.Array.Repa.Eval.Elt
	(Elt (..))
where
import GHC.Prim
import GHC.Exts
import GHC.Types
import GHC.Word
import GHC.Int
class Elt a where
	
	touch :: a -> IO ()
	
	zero  :: a
	
	one   :: a
instance Elt Bool where
 
 touch b
  = IO (\state -> case touch# b state of
			state' -> (# state', () #))
 
 zero = False
 
 one  = True
instance Elt Float where
 
 touch (F# f)
  = IO (\state -> case touch# f state of
			state' -> (# state', () #))
 
 zero = 0
 
 one = 1
instance Elt Double where
 
 touch (D# d)
  = IO (\state -> case touch# d state of
			state' -> (# state', () #))
 
 zero = 0
 
 one = 1
instance Elt Int where
 
 touch (I# i)
  = IO (\state -> case touch# i state of
			state' -> (# state', () #))
 
 zero = 0
 
 one = 1
instance Elt Int8 where
 
 touch (I8# w)
  = IO (\state -> case touch# w state of
			state' -> (# state', () #))
 
 zero = 0
 
 one = 1
instance Elt Int16 where
 
 touch (I16# w)
  = IO (\state -> case touch# w state of
			state' -> (# state', () #))
 
 zero = 0
 
 one = 1
instance Elt Int32 where
 
 touch (I32# w)
  = IO (\state -> case touch# w state of
			state' -> (# state', () #))
 
 zero = 0
 
 one = 1
instance Elt Int64 where
 
 touch (I64# w)
  = IO (\state -> case touch# w state of
			state' -> (# state', () #))
 
 zero = 0
 
 one = 1
instance Elt Word where
 
 touch (W# i)
  = IO (\state -> case touch# i state of
			state' -> (# state', () #))
 
 zero = 0
 
 one = 1
instance Elt Word8 where
 
 touch (W8# w)
  = IO (\state -> case touch# w state of
			state' -> (# state', () #))
 
 zero = 0
 
 one = 1
instance Elt Word16 where
 
 touch (W16# w)
  = IO (\state -> case touch# w state of
			state' -> (# state', () #))
 
 zero = 0
 
 one = 1
instance Elt Word32 where
 
 touch (W32# w)
  = IO (\state -> case touch# w state of
			state' -> (# state', () #))
 
 zero = 0
 
 one = 1
instance Elt Word64 where
 
 touch (W64# w)
  = IO (\state -> case touch# w state of
			state' -> (# state', () #))
 
 zero = 0
 
 one = 1
instance (Elt a, Elt b) => Elt (a, b) where
 
 touch (a, b)
  = do	touch a
	touch b
 
 zero = (zero, zero)
 
 one =  (one, one)
instance (Elt a, Elt b, Elt c) => Elt (a, b, c) where
 
 touch (a, b, c)
  = do	touch a
	touch b
	touch c
 
 zero = (zero, zero, zero)
 
 one =  (one, one, one)
instance (Elt a, Elt b, Elt c, Elt d) => Elt (a, b, c, d) where
 
 touch (a, b, c, d)
  = do	touch a
	touch b
	touch c
	touch d
 
 zero = (zero, zero, zero, zero)
 
 one =  (one, one, one, one)
instance (Elt a, Elt b, Elt c, Elt d, Elt e) => Elt (a, b, c, d, e) where
 
 touch (a, b, c, d, e)
  = do	touch a
	touch b
	touch c
	touch d
	touch e
 
 zero = (zero, zero, zero, zero, zero)
 
 one =  (one, one, one, one, one)
instance (Elt a, Elt b, Elt c, Elt d, Elt e, Elt f) => Elt (a, b, c, d, e, f) where
 
 touch (a, b, c, d, e, f)
  = do	touch a
	touch b
	touch c
	touch d
	touch e
	touch f
 
 zero = (zero, zero, zero, zero, zero, zero)
 
 one =  (one, one, one, one, one, one)