module Data.Yarr.Fusion where
import Prelude as P
import Data.Yarr.Base
import Data.Yarr.Shape as S
import Data.Yarr.Utils.FixedVector as V
class Fusion r fr l sh where
fmap :: (USource r l sh a, USource fr l sh b)
=> (a -> b)
-> UArray r l sh a -> UArray fr l sh b
fmap f = fmapM (return . f)
fmapM :: (USource r l sh a, USource fr l sh b)
=> (a -> IO b) -> UArray r l sh a -> UArray fr l sh b
fzip2 :: (USource r l sh a, USource r l sh b, USource fr l sh c)
=> (a -> b -> c)
-> UArray r l sh a
-> UArray r l sh b
-> UArray fr l sh c
fzip2 f = fzip2M (\x y -> return (f x y))
fzip2M :: (USource r l sh a, USource r l sh b, USource fr l sh c)
=> (a -> b -> IO c)
-> UArray r l sh a
-> UArray r l sh b
-> UArray fr l sh c
fzip3 :: (USource r l sh a, USource r l sh b, USource r l sh c,
USource fr l sh d)
=> (a -> b -> c -> d)
-> UArray r l sh a
-> UArray r l sh b
-> UArray r l sh c
-> UArray fr l sh d
fzip3 f = fzip3M (\x y z -> return (f x y z))
fzip3M :: (USource r l sh a, USource r l sh b, USource r l sh c,
USource fr l sh d)
=> (a -> b -> c -> IO d)
-> UArray r l sh a
-> UArray r l sh b
-> UArray r l sh c
-> UArray fr l sh d
fzip :: (USource r l sh a, USource fr l sh b, Arity n, n ~ S n0)
=> Fun n a b
-> VecList n (UArray r l sh a) -> UArray fr l sh b
fzip fun arrs = let funM = P.fmap return fun in fzipM funM arrs
fzipM :: (USource r l sh a, USource fr l sh b, Arity n, n ~ S n0)
=> Fun n a (IO b)
-> VecList n (UArray r l sh a) -> UArray fr l sh b
class Fusion r fr l sh => DefaultFusion r fr l sh | r -> fr where
dmap :: (USource r l sh a, USource fr l sh b)
=> (a -> b)
-> UArray r l sh a
-> UArray fr l sh b
dmap = Data.Yarr.Fusion.fmap
dmapM :: (USource r l sh a, USource fr l sh b)
=> (a -> IO b)
-> UArray r l sh a
-> UArray fr l sh b
dmapM = fmapM
dzip2 :: (USource r l sh a, USource r l sh b, USource fr l sh c)
=> (a -> b -> c)
-> UArray r l sh a
-> UArray r l sh b
-> UArray fr l sh c
dzip2 = fzip2
dzip2M :: (USource r l sh a, USource r l sh b, USource fr l sh c)
=> (a -> b -> IO c)
-> UArray r l sh a
-> UArray r l sh b
-> UArray fr l sh c
dzip2M = fzip2M
dzip3 :: (USource r l sh a, USource r l sh b, USource r l sh c,
USource fr l sh d)
=> (a -> b -> c -> d)
-> UArray r l sh a
-> UArray r l sh b
-> UArray r l sh c
-> UArray fr l sh d
dzip3 = fzip3
dzip3M :: (USource r l sh a, USource r l sh b, USource r l sh c,
USource fr l sh d)
=> (a -> b -> c -> IO d)
-> UArray r l sh a
-> UArray r l sh b
-> UArray r l sh c
-> UArray fr l sh d
dzip3M = fzip3M
dzip :: (USource r l sh a, USource fr l sh b, Arity n, n ~ S n0)
=> Fun n a b
-> VecList n (UArray r l sh a)
-> UArray fr l sh b
dzip = fzip
dzipM :: (USource r l sh a, USource fr l sh b, Arity n, n ~ S n0)
=> Fun n a (IO b)
-> VecList n (UArray r l sh a)
-> UArray fr l sh b
dzipM = fzipM
class PreferredWorkIndex fl sh sh => IFusion r l fr fl sh | r l fr -> fl where
fimap :: (USource r l sh a, USource fr fl sh b)
=> (sh -> a -> b)
-> UArray r l sh a -> UArray fr fl sh b
fimap f = fimapM (\i x -> return (f i x))
fimapM :: (USource r l sh a, USource fr fl sh b)
=> (sh -> a -> IO b) -> UArray r l sh a -> UArray fr fl sh b
fizip2 :: (USource r l sh a, USource r l sh b, USource fr fl sh c)
=> (sh -> a -> b -> c)
-> UArray r l sh a
-> UArray r l sh b
-> UArray fr fl sh c
fizip2 f = fizip2M (\i x y -> return (f i x y))
fizip2M :: (USource r l sh a, USource r l sh b, USource fr fl sh c)
=> (sh -> a -> b -> IO c)
-> UArray r l sh a
-> UArray r l sh b
-> UArray fr fl sh c
fizip3 :: (USource r l sh a, USource r l sh b, USource r l sh c,
USource fr fl sh d)
=> (sh -> a -> b -> c -> d)
-> UArray r l sh a
-> UArray r l sh b
-> UArray r l sh c
-> UArray fr fl sh d
fizip3 f = fizip3M (\i x y z -> return (f i x y z))
fizip3M :: (USource r l sh a, USource r l sh b, USource r l sh c,
USource fr fl sh d)
=> (sh -> a -> b -> c -> IO d)
-> UArray r l sh a
-> UArray r l sh b
-> UArray r l sh c
-> UArray fr fl sh d
fizip :: (USource r l sh a, USource fr fl sh b, Arity n, n ~ S n0)
=> (sh -> Fun n a b)
-> VecList n (UArray r l sh a) -> UArray fr fl sh b
fizip fun arrs = fizipM funM arrs
where funM i = P.fmap return (fun i)
fizipM :: (USource r l sh a, USource fr fl sh b, Arity n, n ~ S n0)
=> (sh -> Fun n a (IO b))
-> VecList n (UArray r l sh a) -> UArray fr fl sh b
class IFusion r l fr fl sh => DefaultIFusion r l fr fl sh | r l -> fr where
imap :: (USource r l sh a, USource fr fl sh b)
=> (sh -> a -> b)
-> UArray r l sh a
-> UArray fr fl sh b
imap = fimap
imapM :: (USource r l sh a, USource fr fl sh b)
=> (sh -> a -> IO b)
-> UArray r l sh a
-> UArray fr fl sh b
imapM = fimapM
izip2 :: (USource r l sh a, USource r l sh b, USource fr fl sh c)
=> (sh -> a -> b -> c)
-> UArray r l sh a
-> UArray r l sh b
-> UArray fr fl sh c
izip2 = fizip2
izip2M :: (USource r l sh a, USource r l sh b, USource fr fl sh c)
=> (sh -> a -> b -> IO c)
-> UArray r l sh a
-> UArray r l sh b
-> UArray fr fl sh c
izip2M = fizip2M
izip3 :: (USource r l sh a, USource r l sh b, USource r l sh c,
USource fr fl sh d)
=> (sh -> a -> b -> c -> d)
-> UArray r l sh a
-> UArray r l sh b
-> UArray r l sh c
-> UArray fr fl sh d
izip3 = fizip3
izip3M :: (USource r l sh a, USource r l sh b, USource r l sh c,
USource fr fl sh d)
=> (sh -> a -> b -> c -> IO d)
-> UArray r l sh a
-> UArray r l sh b
-> UArray r l sh c
-> UArray fr fl sh d
izip3M = fizip3M
izip :: (USource r l sh a, USource fr fl sh b, Arity n, n ~ S n0)
=> (sh -> Fun n a b)
-> VecList n (UArray r l sh a)
-> UArray fr fl sh b
izip = fizip
izipM :: (USource r l sh a, USource fr fl sh b, Arity n, n ~ S n0)
=> (sh -> Fun n a (IO b))
-> VecList n (UArray r l sh a)
-> UArray fr fl sh b
izipM = fizipM
instance IFusion r l fr l sh => Fusion r fr l sh where
fmapM f = fimapM (\_ x -> f x)
fzip2M f = fizip2M (\_ x y -> f x y)
fzip3M f = fizip3M (\_ x y z -> f x y z)
fzipM funM = fizipM (\_ -> funM)