{-# LANGUAGE MultiParamTypeClasses, LambdaCase, PolyKinds, Safe #-}
module Math.Tools.Functor where
import Control.Applicative
class BiFunctor op where
bimap :: (a -> b) -> (c -> d) -> op a c -> op b d
infixr 8 `interleave`
class (Functor f) => InterleaveFunctor f where
interleave :: f a -> f a -> f a
funzip :: (Functor f) => f (a,b) -> (f a, f b)
funzip :: forall (f :: * -> *) a b. Functor f => f (a, b) -> (f a, f b)
funzip f (a, b)
m = (((a, b) -> a) -> f (a, b) -> f a
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a, b) -> a
forall a b. (a, b) -> a
fst f (a, b)
m, ((a, b) -> b) -> f (a, b) -> f b
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a, b) -> b
forall a b. (a, b) -> b
snd f (a, b)
m)
fst3 :: (a,b,c) -> a
fst3 :: forall a b c. (a, b, c) -> a
fst3 (a
a,b
_,c
_) = a
a
snd3 :: (a,b,c) -> b
snd3 :: forall a b c. (a, b, c) -> b
snd3 (a
_,b
b,c
_) = b
b
thrd3 :: (a,b,c) -> c
thrd3 :: forall a b c. (a, b, c) -> c
thrd3 (a
_,b
_,c
c) = c
c
funzip3 :: (Functor f) => f (a,b,c) -> (f a, f b, f c)
funzip3 :: forall (f :: * -> *) a b c.
Functor f =>
f (a, b, c) -> (f a, f b, f c)
funzip3 f (a, b, c)
m = (((a, b, c) -> a) -> f (a, b, c) -> f a
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a, b, c) -> a
forall a b c. (a, b, c) -> a
fst3 f (a, b, c)
m,((a, b, c) -> b) -> f (a, b, c) -> f b
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a, b, c) -> b
forall a b c. (a, b, c) -> b
snd3 f (a, b, c)
m,((a, b, c) -> c) -> f (a, b, c) -> f c
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a, b, c) -> c
forall a b c. (a, b, c) -> c
thrd3 f (a, b, c)
m)
unzipWith :: (Functor f) => (a -> (b,c)) -> f a -> (f b, f c)
unzipWith :: forall (f :: * -> *) a b c.
Functor f =>
(a -> (b, c)) -> f a -> (f b, f c)
unzipWith a -> (b, c)
f f a
m = ((a -> b) -> f a -> f b
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((b, c) -> b
forall a b. (a, b) -> a
fst ((b, c) -> b) -> (a -> (b, c)) -> a -> b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> (b, c)
f) f a
m, (a -> c) -> f a -> f c
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((b, c) -> c
forall a b. (a, b) -> b
snd ((b, c) -> c) -> (a -> (b, c)) -> a -> c
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> (b, c)
f) f a
m)
fzipWith3 :: (Applicative f) => (a -> b -> c -> d) -> f a -> f b -> f c -> f d
fzipWith3 :: forall (f :: * -> *) a b c d.
Applicative f =>
(a -> b -> c -> d) -> f a -> f b -> f c -> f d
fzipWith3 = (a -> b -> c -> d) -> f a -> f b -> f c -> f d
forall (f :: * -> *) a b c d.
Applicative f =>
(a -> b -> c -> d) -> f a -> f b -> f c -> f d
liftA3
fzip :: (Applicative f) => f a -> f b -> f (a,b)
fzip :: forall (f :: * -> *) a b. Applicative f => f a -> f b -> f (a, b)
fzip = (a -> b -> (a, b)) -> f a -> f b -> f (a, b)
forall a b c. (a -> b -> c) -> f a -> f b -> f c
forall (f :: * -> *) a b c.
Applicative f =>
(a -> b -> c) -> f a -> f b -> f c
liftA2 (,)
infixl 8 <&>
(<&>) :: (Applicative f) => f a -> f b -> f (a,b)
<&> :: forall (f :: * -> *) a b. Applicative f => f a -> f b -> f (a, b)
(<&>) = f a -> f b -> f (a, b)
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f (a, b)
fzip
fzip3 :: (Applicative f) => f a -> f b -> f c -> f (a,b,c)
fzip3 :: forall (f :: * -> *) a b c.
Applicative f =>
f a -> f b -> f c -> f (a, b, c)
fzip3 = (a -> b -> c -> (a, b, c)) -> f a -> f b -> f c -> f (a, b, c)
forall (f :: * -> *) a b c d.
Applicative f =>
(a -> b -> c -> d) -> f a -> f b -> f c -> f d
liftA3 (,,)
fzip4 :: (Applicative f) => f a -> f b -> f c -> f d -> f (a,b,c,d)
fzip4 :: forall (f :: * -> *) a b c d.
Applicative f =>
f a -> f b -> f c -> f d -> f (a, b, c, d)
fzip4 = (a -> b -> c -> d -> (a, b, c, d))
-> f a -> f b -> f c -> f d -> f (a, b, c, d)
forall (f :: * -> *) a b c d e.
Applicative f =>
(a -> b -> c -> d -> e) -> f a -> f b -> f c -> f d -> f e
liftA4 (,,,)
liftA4 :: (Applicative f) => (a -> b -> c -> d -> e) -> f a -> f b -> f c -> f d -> f e
liftA4 :: forall (f :: * -> *) a b c d e.
Applicative f =>
(a -> b -> c -> d -> e) -> f a -> f b -> f c -> f d -> f e
liftA4 a -> b -> c -> d -> e
f f a
x f b
y f c
z f d
t = (a -> b -> c -> d -> e) -> f (a -> b -> c -> d -> e)
forall a. a -> f a
forall (f :: * -> *) a. Applicative f => a -> f a
pure a -> b -> c -> d -> e
f f (a -> b -> c -> d -> e) -> f a -> f (b -> c -> d -> e)
forall a b. f (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> f a
x f (b -> c -> d -> e) -> f b -> f (c -> d -> e)
forall a b. f (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> f b
y f (c -> d -> e) -> f c -> f (d -> e)
forall a b. f (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> f c
z f (d -> e) -> f d -> f e
forall a b. f (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> f d
t