module Control.ExtendableMap
( ExtandableMap (extendMap),
)
where
import Data.Bifunctor (bimap)
import Data.Stream (Stream)
import qualified Data.Vector as DV
import qualified Data.Vector.Generic.Sized as DVGS
import GHC.Base (fmap, id, (.))
class ExtandableMap a b c d where
extendMap :: (a -> b) -> c -> d
instance ExtandableMap a b a b where
extendMap :: (a -> b) -> a -> b
extendMap = (a -> b) -> a -> b
forall a. a -> a
id
instance
(ExtandableMap a b c0 d0, ExtandableMap a b c1 d1) =>
ExtandableMap a b (c0, c1) (d0, d1)
where
extendMap :: (a -> b) -> (c0, c1) -> (d0, d1)
extendMap :: (a -> b) -> (c0, c1) -> (d0, d1)
extendMap a -> b
f = (c0 -> d0) -> (c1 -> d1) -> (c0, c1) -> (d0, d1)
forall a b c d. (a -> b) -> (c -> d) -> (a, c) -> (b, d)
forall (p :: * -> * -> *) a b c d.
Bifunctor p =>
(a -> b) -> (c -> d) -> p a c -> p b d
bimap ((a -> b) -> c0 -> d0
forall a b c d. ExtandableMap a b c d => (a -> b) -> c -> d
extendMap a -> b
f) ((a -> b) -> c1 -> d1
forall a b c d. ExtandableMap a b c d => (a -> b) -> c -> d
extendMap a -> b
f)
instance
(ExtandableMap a b c0 d0, ExtandableMap a b c1 d1, ExtandableMap a b c2 d2) =>
ExtandableMap a b (c0, c1, c2) (d0, d1, d2)
where
extendMap :: (a -> b) -> (c0, c1, c2) -> (d0, d1, d2)
extendMap a -> b
f (c0
x0, c1
x1, c2
x2) = ((a -> b) -> c0 -> d0
forall a b c d. ExtandableMap a b c d => (a -> b) -> c -> d
extendMap a -> b
f c0
x0, (a -> b) -> c1 -> d1
forall a b c d. ExtandableMap a b c d => (a -> b) -> c -> d
extendMap a -> b
f c1
x1, (a -> b) -> c2 -> d2
forall a b c d. ExtandableMap a b c d => (a -> b) -> c -> d
extendMap a -> b
f c2
x2)
instance (ExtandableMap a b c d) => ExtandableMap a b [c] [d] where
extendMap :: (a -> b) -> [c] -> [d]
extendMap a -> b
f = (c -> d) -> [c] -> [d]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((a -> b) -> c -> d
forall a b c d. ExtandableMap a b c d => (a -> b) -> c -> d
extendMap a -> b
f)
instance
(ExtandableMap a b c d) =>
ExtandableMap a b (DVGS.Vector DV.Vector n c) (DVGS.Vector DV.Vector n d)
where
extendMap :: (a -> b) -> Vector Vector n c -> Vector Vector n d
extendMap a -> b
f = (c -> d) -> Vector Vector n c -> Vector Vector n d
forall a b. (a -> b) -> Vector Vector n a -> Vector Vector n b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((a -> b) -> c -> d
forall a b c d. ExtandableMap a b c d => (a -> b) -> c -> d
extendMap a -> b
f)
instance (ExtandableMap a b c d) => ExtandableMap a b (Stream c) (Stream d) where
extendMap :: (a -> b) -> Stream c -> Stream d
extendMap a -> b
f = (c -> d) -> Stream c -> Stream d
forall a b. (a -> b) -> Stream a -> Stream b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((a -> b) -> c -> d
forall a b c d. ExtandableMap a b c d => (a -> b) -> c -> d
extendMap a -> b
f)
instance
(ExtandableMap a b c d) =>
ExtandableMap a b (r -> c) (r -> d)
where
extendMap :: (a -> b) -> (r -> c) -> (r -> d)
extendMap :: (a -> b) -> (r -> c) -> r -> d
extendMap a -> b
f = (c -> d) -> (r -> c) -> r -> d
forall b c a. (b -> c) -> (a -> b) -> a -> c
(.) ((a -> b) -> c -> d
forall a b c d. ExtandableMap a b c d => (a -> b) -> c -> d
extendMap a -> b
f)