module Data.Rope.Annotation.Product
( (:*:)(..)
, fstF
, sndF
) where
import Control.Applicative hiding (empty)
import Data.Monoid (mappend)
import Data.Foldable (Foldable, foldMap)
import qualified Data.Foldable
import Data.Traversable (Traversable(traverse))
import Data.Rope.Annotation
infixr 5 :*:
data (f :*: g) a = f a :*: g a
fstF :: (f :*: g) a -> f a
fstF ~(f :*: _) = f
sndF :: (f :*: g) a -> g a
sndF ~(_ :*: g) = g
instance (Functor f, Functor g) => Functor (f :*: g) where
fmap f (a :*: b) = fmap f a :*: fmap f b
instance (Applicative f, Applicative g) => Applicative (f :*: g) where
pure a = pure a :*: pure a
(f :*: g) <*> (a :*: b) = (f <*> a) :*: (g <*> b)
instance (Foldable f, Foldable g) => Foldable (f :*: g) where
foldMap f (a :*: b) = foldMap f a `mappend` foldMap f b
instance (Traversable f, Traversable g) => Traversable (f :*: g) where
traverse f (a :*: b) = (:*:) <$> traverse f a <*> traverse f b
instance (MonoidA f, MonoidA g) => MonoidA (f :*: g) where
emptyA = emptyA :*: emptyA
appendA r (a :*: a') s (b :*: b') =
appendA r a s b :*: appendA r a' s b'
instance (ReducerA f, ReducerA g) => ReducerA (f :*: g) where
unitA r = unitA r :*: unitA r
snocA r n (f :*: g) = snocA r n f :*: snocA r n g
consA n r (f :*: g) = consA n r f :*: consA n r g
instance (BreakableA f, BreakableA g) => BreakableA (f :*: g) where
dropA n r (f :*: g) = dropA n r f :*: dropA n r g
takeA n r (f :*: g) = takeA n r f :*: takeA n r g
splitAtA n r (f :*: g) = (f' :*: g' , f'' :*: g'') where
(f',f'') = splitAtA n r f
(g',g'') = splitAtA n r g