{-# LANGUAGE MagicHash,BangPatterns #-} module Data.Array.Static where import Data.Static import GHC.Exts import Data.Ix data StaticArray i e = StaticArray i i Addr# bounds :: Ix i => StaticArray i e -> (i,i) bounds :: StaticArray i e -> (i, i) bounds (StaticArray i s i e Addr# _) = (i s,i e) (!) :: (StaticElement e,Ix i) => StaticArray i e -> i -> e (!) (StaticArray i s i e Addr# addr) i i = let !(I# Int# ri) = (i, i) -> i -> Int forall a. Ix a => (a, a) -> a -> Int index (i s,i e) i i in Addr# -> Int# -> e forall e. StaticElement e => Addr# -> Int# -> e extract Addr# addr Int# ri