#include "fusion-phases.h"
module Data.Array.Parallel.Unlifted.Sequential.Flat.Stream (
streamU, unstreamU, unstreamMU
) where
import Data.Array.Parallel.Base (
(:*:)(..), fstS, sndS, ST, Rebox(..))
import Data.Array.Parallel.Stream (
Step(..), Stream(..), mapS, zipS)
import Data.Array.Parallel.Unlifted.Sequential.Flat.UArr (
UArr, MUArr, UA, indexU, lengthU, zipU, fstU, sndU, newDynU, writeMU)
streamU :: UA a => UArr a -> Stream a
streamU !arr = Stream next 0 n
where
n = lengthU arr
next i | i == n = Done
| otherwise = Yield (arr `indexU` i) (i+1)
unstreamU :: UA a => Stream a -> UArr a
unstreamU st@(Stream next s n) = newDynU n (\marr -> unstreamMU marr st)
unstreamMU :: UA a => MUArr a s -> Stream a -> ST s Int
unstreamMU marr (Stream next s n) = fill s 0
where
fill s i = i `seq`
case next s of
Done -> return i
Skip s' -> fill s' i
Yield x s' ->
do
writeMU marr i x
fill s' (i+1)
(for fontlocking)
"streamU/unstreamU" forall s.
streamU (unstreamU s) = s
#-}
(for fontlocking)
"streamU/zipU" forall a1 a2.
streamU (zipU a1 a2) = zipS (streamU a1) (streamU a2)
"fstU/unstreamU" forall s.
fstU (unstreamU s) = unstreamU (mapS fstS s)
"sndU/unstreamU" forall s.
sndU (unstreamU s) = unstreamU (mapS sndS s)
#-}