module Data.Separated.FlipSeparated(
FlipSeparated
, flipSeparated
, flipSeparated1
, fempty
) where
import Control.Applicative(Applicative(pure, (<*>)))
import Control.Category(Category(id, (.)))
import Control.Lens.Getter((^.))
import Control.Lens.Iso(Iso, iso)
import Control.Lens.Review((#))
import Data.Bifunctor(Bifunctor(bimap))
import Data.Eq(Eq)
import Data.Functor(Functor(fmap))
import Data.Functor.Apply(Apply((<.>)))
import Data.List(zipWith)
import Data.Monoid(Monoid(mappend, mempty))
import Data.Ord(Ord)
import Data.Semigroup(Semigroup((<>)))
import Data.Separated.FlipSeparatedCons(FlipSeparatedCons(FlipSeparatedConsF, FlipSeparatedConsG, (+.)))
import Data.Separated.Separated(Separated, Separated1, separated, separated1, separatedSwap, empty)
import Data.Separated.SeparatedCons((+:))
import Prelude(Show(show))
newtype FlipSeparated a s =
FlipSeparated (Separated s a)
deriving (Eq, Ord)
instance Bifunctor FlipSeparated where
bimap f g (FlipSeparated x) =
FlipSeparated (bimap g f x)
instance Functor (FlipSeparated a) where
fmap =
bimap id
instance Semigroup a => Apply (FlipSeparated a) where
FlipSeparated x <.> FlipSeparated y =
FlipSeparated (separatedSwap # (x ^. separatedSwap <.> y ^. separatedSwap))
instance Monoid s => Applicative (FlipSeparated s) where
FlipSeparated x <*> FlipSeparated y =
FlipSeparated (separatedSwap # (x ^. separatedSwap <*> y ^. separatedSwap))
pure =
FlipSeparated . (#) separatedSwap . pure
instance (Show s, Show a) => Show (FlipSeparated s a) where
show (FlipSeparated x) =
show x
instance Semigroup (FlipSeparated s a) where
FlipSeparated x <> FlipSeparated y =
FlipSeparated (x <> y)
instance Monoid (FlipSeparated s a) where
mappend =
(<>)
mempty =
FlipSeparated mempty
instance FlipSeparatedCons FlipSeparated1 FlipSeparated where
type FlipSeparatedConsF FlipSeparated = FlipSeparated1
type FlipSeparatedConsG FlipSeparated1 = FlipSeparated
s +. p =
(s +: flipSeparated1 # p) ^. flipSeparated
flipSeparated ::
Iso (Separated s a) (Separated t b) (FlipSeparated a s) (FlipSeparated b t)
flipSeparated =
iso FlipSeparated (\(FlipSeparated x) -> x)
fempty ::
FlipSeparated a s
fempty =
FlipSeparated empty
newtype FlipSeparated1 s a =
FlipSeparated1 (Separated1 a s)
instance Bifunctor FlipSeparated1 where
bimap f g (FlipSeparated1 x) =
FlipSeparated1 (bimap g f x)
instance Functor (FlipSeparated1 a) where
fmap =
bimap id
instance Semigroup a => Apply (FlipSeparated1 a) where
(<.>) =
flipSeparated1Ap (<>)
instance Monoid s => Applicative (FlipSeparated1 s) where
(<*>) =
flipSeparated1Ap mappend
pure a =
FlipSeparated1 ((a, pure a) ^. separated1)
instance (Show s, Show a) => Show (FlipSeparated1 s a) where
show (FlipSeparated1 x) =
show x
flipSeparated1 ::
Iso (Separated1 a s) (Separated1 b t) (FlipSeparated1 s a) (FlipSeparated1 t b)
flipSeparated1 =
iso FlipSeparated1 (\(FlipSeparated1 x) -> x)
instance FlipSeparatedCons FlipSeparated FlipSeparated1 where
type FlipSeparatedConsF FlipSeparated1 = FlipSeparated
type FlipSeparatedConsG FlipSeparated = FlipSeparated1
a +. p =
(a +: flipSeparated # p) ^. flipSeparated1
flipSeparated1Ap ::
(s -> s -> s)
-> FlipSeparated1 s (a -> b)
-> FlipSeparated1 s a
-> FlipSeparated1 s b
flipSeparated1Ap op (FlipSeparated1 x) (FlipSeparated1 y) =
let (f, fs) = separated1 # x
(a, as) = separated1 # y
in FlipSeparated1 ((f a, zipWith (\(s, f') (t, a') -> (s `op` t, f' a')) (separated # fs) (separated # as) ^. separated) ^. separated1)