packages feed

dvda-0.1: Dvda/HomoDim.hs

{-# OPTIONS_GHC -Wall #-}

module Dvda.HomoDim ( HomoDim(..)
                    , homoOfShape
                    , shapeOfHomo
                    ) where

import Control.DeepSeq
import Data.Array.Repa ( Shape(..) )
import Data.Hashable ( Hashable, hash )

newtype HomoDim = HomoDim [Int] deriving (Eq, Show)

homoOfShape :: Shape sh => sh -> HomoDim
homoOfShape = shapeOfList . listOfShape

shapeOfHomo :: Shape sh => HomoDim -> sh
shapeOfHomo = shapeOfList . listOfShape

instance Hashable HomoDim where
  hash (HomoDim xs) = hash xs

instance Shape HomoDim where
  listOfShape (HomoDim xs) = xs
  shapeOfList = HomoDim
  deepSeq xs y = listOfShape xs `deepseq` y
  rank = length . listOfShape
  size = product . listOfShape
  zeroDim = shapeOfList []
  addDim x y = shapeOfList $ zipWith (+) (listOfShape x) (listOfShape y)
  unitDim = error "need to finish instancing Shape HomoDim"
  intersectDim = error "need to finish instancing Shape HomoDim"
  sizeIsValid = error "need to finish instancing Shape HomoDim"
  toIndex = error "need to finish instancing Shape HomoDim"
  fromIndex = error "need to finish instancing Shape HomoDim"
  inShapeRange = error "need to finish instancing Shape HomoDim"