module Data.Yarr.IO.List where
import Control.Monad
import Data.Yarr.Base
import Data.Yarr.Shape as S
import Data.Yarr.Eval
import Data.Yarr.Work
import Debug.Yarr
toList
    :: (USource r l sh a, PreferredWorkIndex l sh i)
    => UArray r l sh a -> IO [a]
toList = work (reduceR S.foldr (:)) (return [])
fromList
    :: Manifest r mr l sh a
    => sh                   
    -> [a]                  
    -> IO (UArray r l sh a) 
fromList sh xs =
    if (length xs) /= (size sh)
        then yerr "fromList: list length doesn't correspond size of array shape"
        else do
            arr <- new sh
            zipWithM_ (linearWrite arr) [0..] xs
            freeze arr