{-# LANGUAGE CPP #-}
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE Safe #-}
{-# LANGUAGE TypeFamilies #-}
module Data.Tuple.Append.Class
(
TupleAddL ((<++)),
TupleAddR ((++>)),
TupleAppend ((+++)),
SequenceTuple (sequenceTupleA, sequenceTupleA_),
FoldTuple (foldlTuple, foldrTuple, foldMapTuple),
)
where
import Data.Foldable (sequenceA_)
import Data.Functor (($>))
#if MIN_VERSION_base(4,9,0)
import Data.List.NonEmpty(NonEmpty((:|)), (<|))
#endif
#if MIN_VERSION_base(4,11,0)
#elif MIN_VERSION_base(4,9,0)
import Data.Semigroup((<>))
#endif
import Data.Monoid (Dual (Dual, getDual), Endo (Endo, appEndo))
class TupleAddL x 𝐯 x𝐯 | x 𝐯 -> x𝐯, x𝐯 -> x, x𝐯 -> 𝐯 where
infixr 5 <++
(<++) ::
x ->
𝐯 ->
x𝐯
class TupleAddR 𝐯 x 𝐯x | 𝐯 x -> 𝐯x, 𝐯x -> 𝐯, 𝐯x -> x where
infixl 5 ++>
(++>) ::
𝐯 ->
x ->
𝐯x
class TupleAppend 𝐮 𝐯 𝐮𝐯 | 𝐮 𝐯 -> 𝐮𝐯, 𝐮 𝐮𝐯 -> 𝐯, 𝐯 𝐮𝐯 -> 𝐮 where
infixr 5 +++
(+++) ::
𝐮 ->
𝐯 ->
𝐮𝐯
class Applicative f => SequenceTuple f f𝐮 𝐮 | f𝐮 -> f 𝐮, f f𝐮 -> 𝐮, f 𝐮 -> f𝐮 where
sequenceTupleA ::
f𝐮 ->
f 𝐮
default sequenceTupleA :: (Traversable t, 𝐮 ~ t b, f𝐮 ~ t (f b)) => f𝐮 -> f 𝐮
sequenceTupleA = f𝐮 -> f 𝐮
forall (t :: * -> *) (f :: * -> *) a.
(Traversable t, Applicative f) =>
t (f a) -> f (t a)
sequenceA
sequenceTupleA_ ::
f𝐮 ->
f ()
sequenceTupleA_ f𝐮
x = f𝐮 -> f 𝐮
forall (f :: * -> *) f𝐮 𝐮. SequenceTuple f f𝐮 𝐮 => f𝐮 -> f 𝐮
sequenceTupleA f𝐮
x f 𝐮 -> () -> f ()
forall (f :: * -> *) a b. Functor f => f a -> b -> f b
$> ()
{-# MINIMAL sequenceTupleA #-}
class FoldTuple v 𝐯 | 𝐯 -> v where
foldlTuple ::
(a -> v -> a) ->
a ->
𝐯 ->
a
foldlTuple a -> v -> a
f a
z 𝐯
t = Endo a -> a -> a
forall a. Endo a -> a -> a
appEndo (Dual (Endo a) -> Endo a
forall a. Dual a -> a
getDual ((v -> Dual (Endo a)) -> 𝐯 -> Dual (Endo a)
forall v 𝐯 m. (FoldTuple v 𝐯, Monoid m) => (v -> m) -> 𝐯 -> m
foldMapTuple (Endo a -> Dual (Endo a)
forall a. a -> Dual a
Dual (Endo a -> Dual (Endo a)) -> (v -> Endo a) -> v -> Dual (Endo a)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> a) -> Endo a
forall a. (a -> a) -> Endo a
Endo ((a -> a) -> Endo a) -> (v -> a -> a) -> v -> Endo a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (a -> v -> a) -> v -> a -> a
forall a b c. (a -> b -> c) -> b -> a -> c
flip a -> v -> a
f) 𝐯
t)) a
z
foldrTuple ::
(v -> a -> a) ->
a ->
𝐯 ->
a
foldrTuple v -> a -> a
f a
z 𝐯
t = Endo a -> a -> a
forall a. Endo a -> a -> a
appEndo ((v -> Endo a) -> 𝐯 -> Endo a
forall v 𝐯 m. (FoldTuple v 𝐯, Monoid m) => (v -> m) -> 𝐯 -> m
foldMapTuple ((a -> a) -> Endo a
forall a. (a -> a) -> Endo a
Endo ((a -> a) -> Endo a) -> (v -> a -> a) -> v -> Endo a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. v -> a -> a
f) 𝐯
t) a
z
foldMapTuple ::
Monoid m =>
(v -> m) ->
𝐯 ->
m
foldMapTuple v -> m
f = (v -> m -> m) -> m -> 𝐯 -> m
forall v 𝐯 a. FoldTuple v 𝐯 => (v -> a -> a) -> a -> 𝐯 -> a
foldrTuple (m -> m -> m
forall a. Monoid a => a -> a -> a
mappend (m -> m -> m) -> (v -> m) -> v -> m -> m
forall b c a. (b -> c) -> (a -> b) -> a -> c
. v -> m
f) m
forall a. Monoid a => a
mempty
{-# MINIMAL foldMapTuple | foldrTuple #-}
instance Applicative f => SequenceTuple f [f a] [a] where
sequenceTupleA :: [f a] -> f [a]
sequenceTupleA = [f a] -> f [a]
forall (t :: * -> *) (f :: * -> *) a.
(Traversable t, Applicative f) =>
t (f a) -> f (t a)
sequenceA
sequenceTupleA_ :: [f a] -> f ()
sequenceTupleA_ = [f a] -> f ()
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Applicative f) =>
t (f a) -> f ()
sequenceA_
instance FoldTuple x [x] where
foldlTuple :: forall a. (a -> x -> a) -> a -> [x] -> a
foldlTuple = (a -> x -> a) -> a -> [x] -> a
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl
foldrTuple :: forall a. (x -> a -> a) -> a -> [x] -> a
foldrTuple = (x -> a -> a) -> a -> [x] -> a
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr
foldMapTuple :: forall m. Monoid m => (x -> m) -> [x] -> m
foldMapTuple = (x -> m) -> [x] -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap
instance TupleAddL x [x] [x] where
<++ :: x -> [x] -> [x]
(<++) = (:)
instance TupleAddR [x] x [x] where
[x]
xs ++> :: [x] -> x -> [x]
++> x
x = [x]
xs [x] -> [x] -> [x]
forall a. [a] -> [a] -> [a]
++ [x
x]
instance TupleAppend [u] [u] [u] where
+++ :: [u] -> [u] -> [u]
(+++) = [u] -> [u] -> [u]
forall a. [a] -> [a] -> [a]
(++)
#if MIN_VERSION_base(4,9,0)
instance TupleAddL x (NonEmpty x) (NonEmpty x) where
<++ :: x -> NonEmpty x -> NonEmpty x
(<++) = x -> NonEmpty x -> NonEmpty x
forall x. x -> NonEmpty x -> NonEmpty x
(<|)
instance TupleAddR (NonEmpty x) x (NonEmpty x) where
~(x
x :| [x]
xs) ++> :: NonEmpty x -> x -> NonEmpty x
++> x
xn = x
x x -> [x] -> NonEmpty x
forall a. a -> [a] -> NonEmpty a
:| ([x]
xs [x] -> x -> [x]
forall 𝐯 x 𝐯x. TupleAddR 𝐯 x 𝐯x => 𝐯 -> x -> 𝐯x
++> x
xn)
instance TupleAppend (NonEmpty x) (NonEmpty x) (NonEmpty x) where
+++ :: NonEmpty x -> NonEmpty x -> NonEmpty x
(+++) = NonEmpty x -> NonEmpty x -> NonEmpty x
forall a. Semigroup a => a -> a -> a
(<>)
instance Applicative f => SequenceTuple f (NonEmpty (f a)) (NonEmpty a) where
sequenceTupleA :: NonEmpty (f a) -> f (NonEmpty a)
sequenceTupleA = NonEmpty (f a) -> f (NonEmpty a)
forall (t :: * -> *) (f :: * -> *) a.
(Traversable t, Applicative f) =>
t (f a) -> f (t a)
sequenceA
sequenceTupleA_ :: NonEmpty (f a) -> f ()
sequenceTupleA_ = NonEmpty (f a) -> f ()
forall (t :: * -> *) (f :: * -> *) a.
(Foldable t, Applicative f) =>
t (f a) -> f ()
sequenceA_
instance FoldTuple x (NonEmpty x) where
foldlTuple :: forall a. (a -> x -> a) -> a -> NonEmpty x -> a
foldlTuple = (a -> x -> a) -> a -> NonEmpty x -> a
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl
foldrTuple :: forall a. (x -> a -> a) -> a -> NonEmpty x -> a
foldrTuple = (x -> a -> a) -> a -> NonEmpty x -> a
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr
foldMapTuple :: forall m. Monoid m => (x -> m) -> NonEmpty x -> m
foldMapTuple = (x -> m) -> NonEmpty x -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap
#endif