module Graphics.Image.Interface.Vector.Storable (
VS(..), Image(..)
) where
import Prelude hiding (map, zipWith)
#if !MIN_VERSION_base(4,8,0)
import Data.Functor
#endif
import Control.DeepSeq (deepseq)
import Data.Typeable (Typeable)
import qualified Data.Vector.Storable as VS
import Graphics.Image.Interface as I
import Graphics.Image.Interface.Vector.Generic
data VS = VS deriving Typeable
instance Show VS where
show _ = "VectorStorable"
instance SuperClass VS cs e => BaseArray VS cs e where
type SuperClass VS cs e =
(ColorSpace cs e, VS.Storable (Pixel cs e))
newtype Image VS cs e = VSImage (VGImage VS.Vector (Pixel cs e))
dims (VSImage img) = dimsVG img
instance (MArray VS cs e, BaseArray VS cs e) => Array VS cs e where
type Manifest VS = VS
type Vector VS = VS.Vector
makeImage !sh = VSImage . makeImageVG sh
makeImageWindowed !sh !wIx !wSz f g = VSImage $ makeImageWindowedVG sh wIx wSz f g
scalar = VSImage . scalarVG
index00 (VSImage img) = index00VG img
map f (VSImage img) = VSImage $ mapVG f img
imap f (VSImage img) = VSImage $ imapVG f img
zipWith f (VSImage img1) (VSImage img2) = VSImage $ zipWithVG f img1 img2
izipWith f (VSImage img1) (VSImage img2) = VSImage $ izipWithVG f img1 img2
traverse (VSImage img) f g = VSImage $ traverseVG img f g
traverse2 (VSImage img1) (VSImage img2) f g = VSImage $ traverse2VG img1 img2 f g
transpose (VSImage img) = VSImage $ transposeVG img
backpermute !sz f (VSImage img) = VSImage $ backpermuteVG sz f img
fromLists = VSImage . fromListsVG
fold f !px0 (VSImage img) = foldlVG f px0 img
foldIx f !px0 (VSImage img) = ifoldlVG f px0 img
(|*|) (VSImage img1) (VSImage img2) = VSImage (multVG img1 img2)
eq (VSImage img1) (VSImage img2) = img1 == img2
compute (VSImage img) = img `deepseq` VSImage img
toManifest = id
toVector (VSImage img) = toVectorVG img
fromVector !sz = VSImage . fromVectorVG sz
instance BaseArray VS cs e => MArray VS cs e where
newtype MImage s VS cs e = MVSImage (MVGImage s VS.Vector (Pixel cs e))
unsafeIndex (VSImage img) = unsafeIndexVG img
deepSeqImage (VSImage img) = deepseq img
foldl f !px0 (VSImage img) = foldlVG f px0 img
foldr f !px0 (VSImage img) = foldrVG f px0 img
makeImageM !sh f = VSImage <$> makeImageMVG sh f
mapM f (VSImage img) = VSImage <$> mapMVG f img
mapM_ f (VSImage img) = mapM_VG f img
foldM f !px0 (VSImage img) = foldMVG f px0 img
foldM_ f !px0 (VSImage img) = foldM_VG f px0 img
mdims (MVSImage mimg) = mdimsVG mimg
thaw (VSImage img) = MVSImage <$> thawVG img
freeze (MVSImage img) = VSImage <$> freezeVG img
new !ix = MVSImage <$> newVG ix
read (MVSImage img) = readVG img
write (MVSImage img) = writeVG img
swap (MVSImage img) = swapVG img