{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
module Data.Array.Accelerate.Convolution.Private where

import qualified Data.Array.Accelerate.Utility.Sliced as Sliced

import qualified Data.Array.Accelerate as A
import Data.Array.Accelerate
          (Exp, Acc, Array, IsNum, Elt,
           (:.)((:.)), Slice, Shape,
           (!), (?), (&&*), (<*), (<=*), )


type Transform2 sh a =
   Acc (Array sh a) ->
   Acc (Array sh a) ->
   Acc (Array sh a)


indexPad ::
   (Shape sh, Slice sh, Elt a, IsNum a) =>
   Exp sh :. Exp Int ->
   Acc (Array (sh:.Int) a) -> Exp a
indexPad (ix:.k) xs =
   0 <=* k &&* k <* Sliced.length xs ? (xs ! A.lift (ix:.k), 0)