packages feed

NoSlow-0.1: NoSlow/Backend/StorableVector.hs

{-# LANGUAGE TypeFamilies #-}
module NoSlow.Backend.StorableVector (
  module Data.StorableVector,
  sum, enumFromTo_Int, zip,
  pair, fst, snd
) where

import NoSlow.Util.Computation
import NoSlow.Util.Base ( Unsupported(..) )

import qualified Data.StorableVector as V
import Data.StorableVector hiding ( zip )
import Foreign ( Storable )
import Prelude hiding ( sum, fst, snd, zip )

instance DeepSeq (V.Vector a)

instance (TestData a, Storable a) => TestData (V.Vector a) where
  testData n = V.pack (testData n)

instance Computation (V.Vector a) where
  type Arg (V.Vector a) = Nil
  type Res (V.Vector a) = V.Vector a
  apply x _ = x

sum :: (Num a, Storable a) => V.Vector a -> a
{-# INLINE sum #-}
sum xs = V.foldl' (+) 0 xs

enumFromTo_Int :: Int -> Int -> V.Vector Int
{-# INLINE enumFromTo_Int #-}
enumFromTo_Int m n = V.sample len (\i -> i+m)
  where
    len = max 0 (n-m+1)

zip = Unsupported
pair = Unsupported
fst = Unsupported
snd = Unsupported