dph-base-0.6.0.1: Data/Array/Parallel/Array.hs
-- | Generic array class.
-- This is used as a compatability layer during testing and debugging.
module Data.Array.Parallel.Array
( Array(..)
, fromList, toList
, toVectors1, toVectors2, toVectors3
, fromVectors1, fromVectors2, fromVectors3)
where
import Control.Monad
import Data.Vector (Vector)
import qualified Data.Vector as V
import qualified Prelude as P
import Prelude hiding (length)
class Array a e where
-- | Check whether an array has a valid internal representation.
valid :: a e -> Bool
-- | Yield an array with just a single element.
singleton :: e -> a e
-- | Append two arrays.
append :: a e -> a e -> a e
-- | Yield the length of an array.
length :: a e -> Int
-- | Retrieve the element at the given index.
index :: a e -> Int -> e
-- | Convert an array to a vector.
toVector :: a e -> Vector e
-- | Convert a vector to an array.
fromVector :: Vector e -> a e
instance Array [] e where
valid = const True
singleton x = [x]
length = P.length
index = (P.!!)
append = (P.++)
toVector = V.fromList
fromVector = V.toList
instance Array Vector e where
valid = const True
singleton = V.singleton
length = V.length
index = (V.!)
append = (V.++)
toVector = id
fromVector = id
-- | Convert a list to an array.
fromList :: Array a e => [e] -> a e
fromList = fromVector . V.fromList
-- | Convert an array to a list.
toList :: Array a e => a e -> [e]
toList = V.toList . toVector
-- | Convert the outer level of an array to vectors.
toVectors1
:: Array a e
=> a e -> Vector e
toVectors1 arr
= toVector arr
-- | Convert the outer two levels of an array to vectors.
toVectors2
:: (Array a1 (a2 e), Array a2 e)
=> a1 (a2 e) -> Vector (Vector e)
toVectors2 = V.map toVector . toVector
-- | Convert the outer three levels of an array to vectors.
toVectors3
:: (Array a1 (a2 (a3 e)), Array a2 (a3 e), Array a3 e)
=> a1 (a2 (a3 e)) -> Vector (Vector (Vector e))
toVectors3 = V.map (V.map toVector) . V.map toVector . toVector
-- | Convert some vectors to an array.
fromVectors1
:: Array a e
=> Vector e -> a e
fromVectors1 vec
= fromVector vec
-- | Convert some vectors to a nested array
fromVectors2
:: (Array a1 (a2 e), Array a2 e)
=> Vector (Vector e) -> a1 (a2 e)
fromVectors2
= fromVector . V.map fromVector
-- | Convert some vectors to a triply nested array
fromVectors3
:: (Array a1 (a2 (a3 e)), Array a2 (a3 e), Array a3 e)
=> Vector (Vector (Vector e)) -> a1 (a2 (a3 e))
fromVectors3
= fromVector . V.map fromVector . V.map (V.map fromVector)