-- |
-- Module      : Network.IRC.Conduit
-- Copyright   : (c) 2017 Michael Walker
-- License     : MIT
-- Maintainer  : Michael Walker <mike@barrucadu.co.uk>
-- Stability   : experimental
-- Portability : portable
--
-- 'Lens'es and 'Prism's.
module Network.IRC.Conduit.Lens where

import           Data.ByteString              (ByteString)
import           Data.Profunctor              (Choice(right'),
                                               Profunctor(dimap))

import           Network.IRC.CTCP             (CTCPByteString)
import           Network.IRC.Conduit.Internal

-- * Lenses for 'Event'

-- | 'Lens' for '_raw'.
raw :: Lens' (Event a) ByteString
{-# INLINE raw #-}
raw :: (ByteString -> f ByteString) -> Event a -> f (Event a)
raw ByteString -> f ByteString
afb Event a
s = (\ByteString
b -> Event a
s { _raw :: ByteString
_raw = ByteString
b }) (ByteString -> Event a) -> f ByteString -> f (Event a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> ByteString -> f ByteString
afb (Event a -> ByteString
forall a. Event a -> ByteString
_raw Event a
s)

-- | 'Lens' for '_source'.
source :: Lens' (Event a) (Source a)
{-# INLINE source #-}
source :: (Source a -> f (Source a)) -> Event a -> f (Event a)
source Source a -> f (Source a)
afb Event a
s = (\Source a
b -> Event a
s { _source :: Source a
_source = Source a
b }) (Source a -> Event a) -> f (Source a) -> f (Event a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Source a -> f (Source a)
afb (Event a -> Source a
forall a. Event a -> Source a
_source Event a
s)

-- | 'Lens' for '_message'.
message :: Lens' (Event a) (Message a)
{-# INLINE message #-}
message :: (Message a -> f (Message a)) -> Event a -> f (Event a)
message Message a -> f (Message a)
afb Event a
s = (\Message a
b -> Event a
s { _message :: Message a
_message = Message a
b }) (Message a -> Event a) -> f (Message a) -> f (Event a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Message a -> f (Message a)
afb (Event a -> Message a
forall a. Event a -> Message a
_message Event a
s)

-- * Prisms for 'Source'

-- | 'Prism' for 'User'
_User :: Prism' (Source a) (NickName a)
{-# INLINE _User #-}
_User :: p (NickName a) (f (NickName a))
-> p (Source (NickName a)) (f (Source (NickName a)))
_User = (Source (NickName a) -> Either (Source (NickName a)) (NickName a))
-> (Either (Source (NickName a)) (f (NickName a))
    -> f (Source (NickName a)))
-> p (Either (Source (NickName a)) (NickName a))
     (Either (Source (NickName a)) (f (NickName a)))
-> p (Source (NickName a)) (f (Source (NickName a)))
forall (p :: * -> * -> *) a b c d.
Profunctor p =>
(a -> b) -> (c -> d) -> p b c -> p a d
dimap
  (\Source (NickName a)
s -> case Source (NickName a)
s of User NickName a
n -> NickName a -> Either (Source (NickName a)) (NickName a)
forall a b. b -> Either a b
Right NickName a
n; Source (NickName a)
_ -> Source (NickName a) -> Either (Source (NickName a)) (NickName a)
forall a b. a -> Either a b
Left Source (NickName a)
s)
  ((Source (NickName a) -> f (Source (NickName a)))
-> (f (NickName a) -> f (Source (NickName a)))
-> Either (Source (NickName a)) (f (NickName a))
-> f (Source (NickName a))
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either Source (NickName a) -> f (Source (NickName a))
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((f (NickName a) -> f (Source (NickName a)))
 -> Either (Source (NickName a)) (f (NickName a))
 -> f (Source (NickName a)))
-> (f (NickName a) -> f (Source (NickName a)))
-> Either (Source (NickName a)) (f (NickName a))
-> f (Source (NickName a))
forall a b. (a -> b) -> a -> b
$ (NickName a -> Source (NickName a))
-> f (NickName a) -> f (Source (NickName a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap NickName a -> Source (NickName a)
forall a. NickName a -> Source (NickName a)
User) (p (Either (Source (NickName a)) (NickName a))
   (Either (Source (NickName a)) (f (NickName a)))
 -> p (Source (NickName a)) (f (Source (NickName a))))
-> (p (NickName a) (f (NickName a))
    -> p (Either (Source (NickName a)) (NickName a))
         (Either (Source (NickName a)) (f (NickName a))))
-> p (NickName a) (f (NickName a))
-> p (Source (NickName a)) (f (Source (NickName a)))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. p (NickName a) (f (NickName a))
-> p (Either (Source (NickName a)) (NickName a))
     (Either (Source (NickName a)) (f (NickName a)))
forall (p :: * -> * -> *) a b c.
Choice p =>
p a b -> p (Either c a) (Either c b)
right'

-- | 'Prism' for 'Channel'
_Channel :: Prism' (Source a) (ChannelName a, NickName a)
{-# INLINE _Channel #-}
_Channel :: p (ChannelName a, ChannelName a) (f (ChannelName a, ChannelName a))
-> p (Source (ChannelName a)) (f (Source (ChannelName a)))
_Channel = (Source (ChannelName a)
 -> Either (Source (ChannelName a)) (ChannelName a, ChannelName a))
-> (Either
      (Source (ChannelName a)) (f (ChannelName a, ChannelName a))
    -> f (Source (ChannelName a)))
-> p (Either
        (Source (ChannelName a)) (ChannelName a, ChannelName a))
     (Either
        (Source (ChannelName a)) (f (ChannelName a, ChannelName a)))
-> p (Source (ChannelName a)) (f (Source (ChannelName a)))
forall (p :: * -> * -> *) a b c d.
Profunctor p =>
(a -> b) -> (c -> d) -> p b c -> p a d
dimap
  (\Source (ChannelName a)
s -> case Source (ChannelName a)
s of Channel ChannelName a
c ChannelName a
n -> (ChannelName a, ChannelName a)
-> Either (Source (ChannelName a)) (ChannelName a, ChannelName a)
forall a b. b -> Either a b
Right (ChannelName a
c,ChannelName a
n); Source (ChannelName a)
_ -> Source (ChannelName a)
-> Either (Source (ChannelName a)) (ChannelName a, ChannelName a)
forall a b. a -> Either a b
Left Source (ChannelName a)
s)
  ((Source (ChannelName a) -> f (Source (ChannelName a)))
-> (f (ChannelName a, ChannelName a) -> f (Source (ChannelName a)))
-> Either
     (Source (ChannelName a)) (f (ChannelName a, ChannelName a))
-> f (Source (ChannelName a))
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either Source (ChannelName a) -> f (Source (ChannelName a))
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((f (ChannelName a, ChannelName a) -> f (Source (ChannelName a)))
 -> Either
      (Source (ChannelName a)) (f (ChannelName a, ChannelName a))
 -> f (Source (ChannelName a)))
-> (f (ChannelName a, ChannelName a) -> f (Source (ChannelName a)))
-> Either
     (Source (ChannelName a)) (f (ChannelName a, ChannelName a))
-> f (Source (ChannelName a))
forall a b. (a -> b) -> a -> b
$ ((ChannelName a, ChannelName a) -> Source (ChannelName a))
-> f (ChannelName a, ChannelName a) -> f (Source (ChannelName a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((ChannelName a -> ChannelName a -> Source (ChannelName a))
-> (ChannelName a, ChannelName a) -> Source (ChannelName a)
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry ChannelName a -> ChannelName a -> Source (ChannelName a)
forall a. NickName a -> NickName a -> Source (NickName a)
Channel)) (p (Either (Source (ChannelName a)) (ChannelName a, ChannelName a))
   (Either
      (Source (ChannelName a)) (f (ChannelName a, ChannelName a)))
 -> p (Source (ChannelName a)) (f (Source (ChannelName a))))
-> (p (ChannelName a, ChannelName a)
      (f (ChannelName a, ChannelName a))
    -> p (Either
            (Source (ChannelName a)) (ChannelName a, ChannelName a))
         (Either
            (Source (ChannelName a)) (f (ChannelName a, ChannelName a))))
-> p (ChannelName a, ChannelName a)
     (f (ChannelName a, ChannelName a))
-> p (Source (ChannelName a)) (f (Source (ChannelName a)))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. p (ChannelName a, ChannelName a) (f (ChannelName a, ChannelName a))
-> p (Either
        (Source (ChannelName a)) (ChannelName a, ChannelName a))
     (Either
        (Source (ChannelName a)) (f (ChannelName a, ChannelName a)))
forall (p :: * -> * -> *) a b c.
Choice p =>
p a b -> p (Either c a) (Either c b)
right'

-- | 'Prism' for 'Server'
_Server :: Prism' (Source a) (ServerName a)
{-# INLINE _Server #-}
_Server :: p (ServerName a) (f (ServerName a))
-> p (Source (ServerName a)) (f (Source (ServerName a)))
_Server = (Source (ServerName a)
 -> Either (Source (ServerName a)) (ServerName a))
-> (Either (Source (ServerName a)) (f (ServerName a))
    -> f (Source (ServerName a)))
-> p (Either (Source (ServerName a)) (ServerName a))
     (Either (Source (ServerName a)) (f (ServerName a)))
-> p (Source (ServerName a)) (f (Source (ServerName a)))
forall (p :: * -> * -> *) a b c d.
Profunctor p =>
(a -> b) -> (c -> d) -> p b c -> p a d
dimap
  (\Source (ServerName a)
s -> case Source (ServerName a)
s of Server ServerName a
n -> ServerName a -> Either (Source (ServerName a)) (ServerName a)
forall a b. b -> Either a b
Right ServerName a
n; Source (ServerName a)
_ -> Source (ServerName a)
-> Either (Source (ServerName a)) (ServerName a)
forall a b. a -> Either a b
Left Source (ServerName a)
s)
  ((Source (ServerName a) -> f (Source (ServerName a)))
-> (f (ServerName a) -> f (Source (ServerName a)))
-> Either (Source (ServerName a)) (f (ServerName a))
-> f (Source (ServerName a))
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either Source (ServerName a) -> f (Source (ServerName a))
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((f (ServerName a) -> f (Source (ServerName a)))
 -> Either (Source (ServerName a)) (f (ServerName a))
 -> f (Source (ServerName a)))
-> (f (ServerName a) -> f (Source (ServerName a)))
-> Either (Source (ServerName a)) (f (ServerName a))
-> f (Source (ServerName a))
forall a b. (a -> b) -> a -> b
$ (ServerName a -> Source (ServerName a))
-> f (ServerName a) -> f (Source (ServerName a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ServerName a -> Source (ServerName a)
forall a. NickName a -> Source (NickName a)
Server) (p (Either (Source (ServerName a)) (ServerName a))
   (Either (Source (ServerName a)) (f (ServerName a)))
 -> p (Source (ServerName a)) (f (Source (ServerName a))))
-> (p (ServerName a) (f (ServerName a))
    -> p (Either (Source (ServerName a)) (ServerName a))
         (Either (Source (ServerName a)) (f (ServerName a))))
-> p (ServerName a) (f (ServerName a))
-> p (Source (ServerName a)) (f (Source (ServerName a)))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. p (ServerName a) (f (ServerName a))
-> p (Either (Source (ServerName a)) (ServerName a))
     (Either (Source (ServerName a)) (f (ServerName a)))
forall (p :: * -> * -> *) a b c.
Choice p =>
p a b -> p (Either c a) (Either c b)
right'

-- * Prisms for 'Message'

-- | 'Prism' for 'Privmsg'
_Privmsg :: Prism' (Message a) (Target a, Either CTCPByteString a)
{-# INLINE _Privmsg #-}
_Privmsg :: p (Target a, Either CTCPByteString (Target a))
  (f (Target a, Either CTCPByteString (Target a)))
-> p (Message (Target a)) (f (Message (Target a)))
_Privmsg = (Message (Target a)
 -> Either
      (Message (Target a)) (Target a, Either CTCPByteString (Target a)))
-> (Either
      (Message (Target a))
      (f (Target a, Either CTCPByteString (Target a)))
    -> f (Message (Target a)))
-> p (Either
        (Message (Target a)) (Target a, Either CTCPByteString (Target a)))
     (Either
        (Message (Target a))
        (f (Target a, Either CTCPByteString (Target a))))
-> p (Message (Target a)) (f (Message (Target a)))
forall (p :: * -> * -> *) a b c d.
Profunctor p =>
(a -> b) -> (c -> d) -> p b c -> p a d
dimap
  (\Message (Target a)
s -> case Message (Target a)
s of Privmsg Target a
t Either CTCPByteString (Target a)
m -> (Target a, Either CTCPByteString (Target a))
-> Either
     (Message (Target a)) (Target a, Either CTCPByteString (Target a))
forall a b. b -> Either a b
Right (Target a
t,Either CTCPByteString (Target a)
m); Message (Target a)
_ -> Message (Target a)
-> Either
     (Message (Target a)) (Target a, Either CTCPByteString (Target a))
forall a b. a -> Either a b
Left Message (Target a)
s)
  ((Message (Target a) -> f (Message (Target a)))
-> (f (Target a, Either CTCPByteString (Target a))
    -> f (Message (Target a)))
-> Either
     (Message (Target a))
     (f (Target a, Either CTCPByteString (Target a)))
-> f (Message (Target a))
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either Message (Target a) -> f (Message (Target a))
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((f (Target a, Either CTCPByteString (Target a))
  -> f (Message (Target a)))
 -> Either
      (Message (Target a))
      (f (Target a, Either CTCPByteString (Target a)))
 -> f (Message (Target a)))
-> (f (Target a, Either CTCPByteString (Target a))
    -> f (Message (Target a)))
-> Either
     (Message (Target a))
     (f (Target a, Either CTCPByteString (Target a)))
-> f (Message (Target a))
forall a b. (a -> b) -> a -> b
$ ((Target a, Either CTCPByteString (Target a))
 -> Message (Target a))
-> f (Target a, Either CTCPByteString (Target a))
-> f (Message (Target a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Target a
 -> Either CTCPByteString (Target a) -> Message (Target a))
-> (Target a, Either CTCPByteString (Target a))
-> Message (Target a)
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Target a -> Either CTCPByteString (Target a) -> Message (Target a)
forall a.
Target a -> Either CTCPByteString (Target a) -> Message (Target a)
Privmsg)) (p (Either
      (Message (Target a)) (Target a, Either CTCPByteString (Target a)))
   (Either
      (Message (Target a))
      (f (Target a, Either CTCPByteString (Target a))))
 -> p (Message (Target a)) (f (Message (Target a))))
-> (p (Target a, Either CTCPByteString (Target a))
      (f (Target a, Either CTCPByteString (Target a)))
    -> p (Either
            (Message (Target a)) (Target a, Either CTCPByteString (Target a)))
         (Either
            (Message (Target a))
            (f (Target a, Either CTCPByteString (Target a)))))
-> p (Target a, Either CTCPByteString (Target a))
     (f (Target a, Either CTCPByteString (Target a)))
-> p (Message (Target a)) (f (Message (Target a)))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. p (Target a, Either CTCPByteString (Target a))
  (f (Target a, Either CTCPByteString (Target a)))
-> p (Either
        (Message (Target a)) (Target a, Either CTCPByteString (Target a)))
     (Either
        (Message (Target a))
        (f (Target a, Either CTCPByteString (Target a))))
forall (p :: * -> * -> *) a b c.
Choice p =>
p a b -> p (Either c a) (Either c b)
right'

-- | 'Prism' for 'Notice'
_Notice :: Prism' (Message a) (Target a, Either CTCPByteString a)
{-# INLINE _Notice #-}
_Notice :: p (Target a, Either CTCPByteString (Target a))
  (f (Target a, Either CTCPByteString (Target a)))
-> p (Message (Target a)) (f (Message (Target a)))
_Notice = (Message (Target a)
 -> Either
      (Message (Target a)) (Target a, Either CTCPByteString (Target a)))
-> (Either
      (Message (Target a))
      (f (Target a, Either CTCPByteString (Target a)))
    -> f (Message (Target a)))
-> p (Either
        (Message (Target a)) (Target a, Either CTCPByteString (Target a)))
     (Either
        (Message (Target a))
        (f (Target a, Either CTCPByteString (Target a))))
-> p (Message (Target a)) (f (Message (Target a)))
forall (p :: * -> * -> *) a b c d.
Profunctor p =>
(a -> b) -> (c -> d) -> p b c -> p a d
dimap
  (\Message (Target a)
s -> case Message (Target a)
s of Notice Target a
t Either CTCPByteString (Target a)
m -> (Target a, Either CTCPByteString (Target a))
-> Either
     (Message (Target a)) (Target a, Either CTCPByteString (Target a))
forall a b. b -> Either a b
Right (Target a
t,Either CTCPByteString (Target a)
m); Message (Target a)
_ -> Message (Target a)
-> Either
     (Message (Target a)) (Target a, Either CTCPByteString (Target a))
forall a b. a -> Either a b
Left Message (Target a)
s)
  ((Message (Target a) -> f (Message (Target a)))
-> (f (Target a, Either CTCPByteString (Target a))
    -> f (Message (Target a)))
-> Either
     (Message (Target a))
     (f (Target a, Either CTCPByteString (Target a)))
-> f (Message (Target a))
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either Message (Target a) -> f (Message (Target a))
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((f (Target a, Either CTCPByteString (Target a))
  -> f (Message (Target a)))
 -> Either
      (Message (Target a))
      (f (Target a, Either CTCPByteString (Target a)))
 -> f (Message (Target a)))
-> (f (Target a, Either CTCPByteString (Target a))
    -> f (Message (Target a)))
-> Either
     (Message (Target a))
     (f (Target a, Either CTCPByteString (Target a)))
-> f (Message (Target a))
forall a b. (a -> b) -> a -> b
$ ((Target a, Either CTCPByteString (Target a))
 -> Message (Target a))
-> f (Target a, Either CTCPByteString (Target a))
-> f (Message (Target a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Target a
 -> Either CTCPByteString (Target a) -> Message (Target a))
-> (Target a, Either CTCPByteString (Target a))
-> Message (Target a)
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Target a -> Either CTCPByteString (Target a) -> Message (Target a)
forall a.
Target a -> Either CTCPByteString (Target a) -> Message (Target a)
Notice)) (p (Either
      (Message (Target a)) (Target a, Either CTCPByteString (Target a)))
   (Either
      (Message (Target a))
      (f (Target a, Either CTCPByteString (Target a))))
 -> p (Message (Target a)) (f (Message (Target a))))
-> (p (Target a, Either CTCPByteString (Target a))
      (f (Target a, Either CTCPByteString (Target a)))
    -> p (Either
            (Message (Target a)) (Target a, Either CTCPByteString (Target a)))
         (Either
            (Message (Target a))
            (f (Target a, Either CTCPByteString (Target a)))))
-> p (Target a, Either CTCPByteString (Target a))
     (f (Target a, Either CTCPByteString (Target a)))
-> p (Message (Target a)) (f (Message (Target a)))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. p (Target a, Either CTCPByteString (Target a))
  (f (Target a, Either CTCPByteString (Target a)))
-> p (Either
        (Message (Target a)) (Target a, Either CTCPByteString (Target a)))
     (Either
        (Message (Target a))
        (f (Target a, Either CTCPByteString (Target a))))
forall (p :: * -> * -> *) a b c.
Choice p =>
p a b -> p (Either c a) (Either c b)
right'

-- | 'Prism' for 'Nick'
_Nick :: Prism' (Message a) (NickName a)
{-# INLINE _Nick #-}
_Nick :: p (NickName a) (f (NickName a))
-> p (Message (NickName a)) (f (Message (NickName a)))
_Nick = (Message (NickName a)
 -> Either (Message (NickName a)) (NickName a))
-> (Either (Message (NickName a)) (f (NickName a))
    -> f (Message (NickName a)))
-> p (Either (Message (NickName a)) (NickName a))
     (Either (Message (NickName a)) (f (NickName a)))
-> p (Message (NickName a)) (f (Message (NickName a)))
forall (p :: * -> * -> *) a b c d.
Profunctor p =>
(a -> b) -> (c -> d) -> p b c -> p a d
dimap
  (\Message (NickName a)
s -> case Message (NickName a)
s of Nick NickName a
n -> NickName a -> Either (Message (NickName a)) (NickName a)
forall a b. b -> Either a b
Right NickName a
n; Message (NickName a)
_ -> Message (NickName a) -> Either (Message (NickName a)) (NickName a)
forall a b. a -> Either a b
Left Message (NickName a)
s)
  ((Message (NickName a) -> f (Message (NickName a)))
-> (f (NickName a) -> f (Message (NickName a)))
-> Either (Message (NickName a)) (f (NickName a))
-> f (Message (NickName a))
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either Message (NickName a) -> f (Message (NickName a))
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((f (NickName a) -> f (Message (NickName a)))
 -> Either (Message (NickName a)) (f (NickName a))
 -> f (Message (NickName a)))
-> (f (NickName a) -> f (Message (NickName a)))
-> Either (Message (NickName a)) (f (NickName a))
-> f (Message (NickName a))
forall a b. (a -> b) -> a -> b
$ (NickName a -> Message (NickName a))
-> f (NickName a) -> f (Message (NickName a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap NickName a -> Message (NickName a)
forall a. Target a -> Message (Target a)
Nick) (p (Either (Message (NickName a)) (NickName a))
   (Either (Message (NickName a)) (f (NickName a)))
 -> p (Message (NickName a)) (f (Message (NickName a))))
-> (p (NickName a) (f (NickName a))
    -> p (Either (Message (NickName a)) (NickName a))
         (Either (Message (NickName a)) (f (NickName a))))
-> p (NickName a) (f (NickName a))
-> p (Message (NickName a)) (f (Message (NickName a)))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. p (NickName a) (f (NickName a))
-> p (Either (Message (NickName a)) (NickName a))
     (Either (Message (NickName a)) (f (NickName a)))
forall (p :: * -> * -> *) a b c.
Choice p =>
p a b -> p (Either c a) (Either c b)
right'

-- | 'Prism' for 'Join'
_Join :: Prism' (Message a) (ChannelName a)
{-# INLINE _Join #-}
_Join :: p (ChannelName a) (f (ChannelName a))
-> p (Message (ChannelName a)) (f (Message (ChannelName a)))
_Join = (Message (ChannelName a)
 -> Either (Message (ChannelName a)) (ChannelName a))
-> (Either (Message (ChannelName a)) (f (ChannelName a))
    -> f (Message (ChannelName a)))
-> p (Either (Message (ChannelName a)) (ChannelName a))
     (Either (Message (ChannelName a)) (f (ChannelName a)))
-> p (Message (ChannelName a)) (f (Message (ChannelName a)))
forall (p :: * -> * -> *) a b c d.
Profunctor p =>
(a -> b) -> (c -> d) -> p b c -> p a d
dimap
  (\Message (ChannelName a)
s -> case Message (ChannelName a)
s of Join ChannelName a
c -> ChannelName a -> Either (Message (ChannelName a)) (ChannelName a)
forall a b. b -> Either a b
Right ChannelName a
c; Message (ChannelName a)
_ -> Message (ChannelName a)
-> Either (Message (ChannelName a)) (ChannelName a)
forall a b. a -> Either a b
Left Message (ChannelName a)
s)
  ((Message (ChannelName a) -> f (Message (ChannelName a)))
-> (f (ChannelName a) -> f (Message (ChannelName a)))
-> Either (Message (ChannelName a)) (f (ChannelName a))
-> f (Message (ChannelName a))
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either Message (ChannelName a) -> f (Message (ChannelName a))
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((f (ChannelName a) -> f (Message (ChannelName a)))
 -> Either (Message (ChannelName a)) (f (ChannelName a))
 -> f (Message (ChannelName a)))
-> (f (ChannelName a) -> f (Message (ChannelName a)))
-> Either (Message (ChannelName a)) (f (ChannelName a))
-> f (Message (ChannelName a))
forall a b. (a -> b) -> a -> b
$ (ChannelName a -> Message (ChannelName a))
-> f (ChannelName a) -> f (Message (ChannelName a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ChannelName a -> Message (ChannelName a)
forall a. Target a -> Message (Target a)
Join) (p (Either (Message (ChannelName a)) (ChannelName a))
   (Either (Message (ChannelName a)) (f (ChannelName a)))
 -> p (Message (ChannelName a)) (f (Message (ChannelName a))))
-> (p (ChannelName a) (f (ChannelName a))
    -> p (Either (Message (ChannelName a)) (ChannelName a))
         (Either (Message (ChannelName a)) (f (ChannelName a))))
-> p (ChannelName a) (f (ChannelName a))
-> p (Message (ChannelName a)) (f (Message (ChannelName a)))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. p (ChannelName a) (f (ChannelName a))
-> p (Either (Message (ChannelName a)) (ChannelName a))
     (Either (Message (ChannelName a)) (f (ChannelName a)))
forall (p :: * -> * -> *) a b c.
Choice p =>
p a b -> p (Either c a) (Either c b)
right'

-- | 'Prism' for 'Part'
_Part :: Prism' (Message a) (ChannelName a, Reason a)
{-# INLINE _Part #-}
_Part :: p (ChannelName a, Reason (ChannelName a))
  (f (ChannelName a, Reason (ChannelName a)))
-> p (Message (ChannelName a)) (f (Message (ChannelName a)))
_Part = (Message (ChannelName a)
 -> Either
      (Message (ChannelName a)) (ChannelName a, Reason (ChannelName a)))
-> (Either
      (Message (ChannelName a))
      (f (ChannelName a, Reason (ChannelName a)))
    -> f (Message (ChannelName a)))
-> p (Either
        (Message (ChannelName a)) (ChannelName a, Reason (ChannelName a)))
     (Either
        (Message (ChannelName a))
        (f (ChannelName a, Reason (ChannelName a))))
-> p (Message (ChannelName a)) (f (Message (ChannelName a)))
forall (p :: * -> * -> *) a b c d.
Profunctor p =>
(a -> b) -> (c -> d) -> p b c -> p a d
dimap
  (\Message (ChannelName a)
s -> case Message (ChannelName a)
s of Part ChannelName a
c Reason (ChannelName a)
r -> (ChannelName a, Reason (ChannelName a))
-> Either
     (Message (ChannelName a)) (ChannelName a, Reason (ChannelName a))
forall a b. b -> Either a b
Right (ChannelName a
c,Reason (ChannelName a)
r); Message (ChannelName a)
_ -> Message (ChannelName a)
-> Either
     (Message (ChannelName a)) (ChannelName a, Reason (ChannelName a))
forall a b. a -> Either a b
Left Message (ChannelName a)
s)
  ((Message (ChannelName a) -> f (Message (ChannelName a)))
-> (f (ChannelName a, Reason (ChannelName a))
    -> f (Message (ChannelName a)))
-> Either
     (Message (ChannelName a))
     (f (ChannelName a, Reason (ChannelName a)))
-> f (Message (ChannelName a))
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either Message (ChannelName a) -> f (Message (ChannelName a))
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((f (ChannelName a, Reason (ChannelName a))
  -> f (Message (ChannelName a)))
 -> Either
      (Message (ChannelName a))
      (f (ChannelName a, Reason (ChannelName a)))
 -> f (Message (ChannelName a)))
-> (f (ChannelName a, Reason (ChannelName a))
    -> f (Message (ChannelName a)))
-> Either
     (Message (ChannelName a))
     (f (ChannelName a, Reason (ChannelName a)))
-> f (Message (ChannelName a))
forall a b. (a -> b) -> a -> b
$ ((ChannelName a, Reason (ChannelName a))
 -> Message (ChannelName a))
-> f (ChannelName a, Reason (ChannelName a))
-> f (Message (ChannelName a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((ChannelName a
 -> Reason (ChannelName a) -> Message (ChannelName a))
-> (ChannelName a, Reason (ChannelName a))
-> Message (ChannelName a)
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry ChannelName a -> Reason (ChannelName a) -> Message (ChannelName a)
forall a. Target a -> Reason (Target a) -> Message (Target a)
Part)) (p (Either
      (Message (ChannelName a)) (ChannelName a, Reason (ChannelName a)))
   (Either
      (Message (ChannelName a))
      (f (ChannelName a, Reason (ChannelName a))))
 -> p (Message (ChannelName a)) (f (Message (ChannelName a))))
-> (p (ChannelName a, Reason (ChannelName a))
      (f (ChannelName a, Reason (ChannelName a)))
    -> p (Either
            (Message (ChannelName a)) (ChannelName a, Reason (ChannelName a)))
         (Either
            (Message (ChannelName a))
            (f (ChannelName a, Reason (ChannelName a)))))
-> p (ChannelName a, Reason (ChannelName a))
     (f (ChannelName a, Reason (ChannelName a)))
-> p (Message (ChannelName a)) (f (Message (ChannelName a)))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. p (ChannelName a, Reason (ChannelName a))
  (f (ChannelName a, Reason (ChannelName a)))
-> p (Either
        (Message (ChannelName a)) (ChannelName a, Reason (ChannelName a)))
     (Either
        (Message (ChannelName a))
        (f (ChannelName a, Reason (ChannelName a))))
forall (p :: * -> * -> *) a b c.
Choice p =>
p a b -> p (Either c a) (Either c b)
right'

-- | 'Prism' for 'Quit'
_Quit :: Prism' (Message a) (Reason a)
{-# INLINE _Quit #-}
_Quit :: p (Reason a) (f (Reason a)) -> p (Message a) (f (Message a))
_Quit = (Message a -> Either (Message a) (Reason a))
-> (Either (Message a) (f (Reason a)) -> f (Message a))
-> p (Either (Message a) (Reason a))
     (Either (Message a) (f (Reason a)))
-> p (Message a) (f (Message a))
forall (p :: * -> * -> *) a b c d.
Profunctor p =>
(a -> b) -> (c -> d) -> p b c -> p a d
dimap
  (\Message a
s -> case Message a
s of Quit Reason a
r -> Reason a -> Either (Message a) (Reason a)
forall a b. b -> Either a b
Right Reason a
r; Message a
_ -> Message a -> Either (Message a) (Reason a)
forall a b. a -> Either a b
Left Message a
s)
  ((Message a -> f (Message a))
-> (f (Reason a) -> f (Message a))
-> Either (Message a) (f (Reason a))
-> f (Message a)
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either Message a -> f (Message a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((f (Reason a) -> f (Message a))
 -> Either (Message a) (f (Reason a)) -> f (Message a))
-> (f (Reason a) -> f (Message a))
-> Either (Message a) (f (Reason a))
-> f (Message a)
forall a b. (a -> b) -> a -> b
$ (Reason a -> Message a) -> f (Reason a) -> f (Message a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Reason a -> Message a
forall a. Reason (Target a) -> Message (Target a)
Quit) (p (Either (Message a) (Reason a))
   (Either (Message a) (f (Reason a)))
 -> p (Message a) (f (Message a)))
-> (p (Reason a) (f (Reason a))
    -> p (Either (Message a) (Reason a))
         (Either (Message a) (f (Reason a))))
-> p (Reason a) (f (Reason a))
-> p (Message a) (f (Message a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. p (Reason a) (f (Reason a))
-> p (Either (Message a) (Reason a))
     (Either (Message a) (f (Reason a)))
forall (p :: * -> * -> *) a b c.
Choice p =>
p a b -> p (Either c a) (Either c b)
right'

-- | 'Prism' for 'Mode'
_Mode :: Prism' (Message a) (Target a, IsModeSet, [ModeFlag a], [ModeArg a])
{-# INLINE _Mode #-}
_Mode :: p (Target a, IsModeSet, [Target a], [Target a])
  (f (Target a, IsModeSet, [Target a], [Target a]))
-> p (Message (Target a)) (f (Message (Target a)))
_Mode = (Message (Target a)
 -> Either
      (Message (Target a)) (Target a, IsModeSet, [Target a], [Target a]))
-> (Either
      (Message (Target a))
      (f (Target a, IsModeSet, [Target a], [Target a]))
    -> f (Message (Target a)))
-> p (Either
        (Message (Target a)) (Target a, IsModeSet, [Target a], [Target a]))
     (Either
        (Message (Target a))
        (f (Target a, IsModeSet, [Target a], [Target a])))
-> p (Message (Target a)) (f (Message (Target a)))
forall (p :: * -> * -> *) a b c d.
Profunctor p =>
(a -> b) -> (c -> d) -> p b c -> p a d
dimap
  (\Message (Target a)
s -> case Message (Target a)
s of Mode Target a
t IsModeSet
i [Target a]
f [Target a]
a -> (Target a, IsModeSet, [Target a], [Target a])
-> Either
     (Message (Target a)) (Target a, IsModeSet, [Target a], [Target a])
forall a b. b -> Either a b
Right (Target a
t,IsModeSet
i,[Target a]
f,[Target a]
a); Message (Target a)
_ -> Message (Target a)
-> Either
     (Message (Target a)) (Target a, IsModeSet, [Target a], [Target a])
forall a b. a -> Either a b
Left Message (Target a)
s)
  ((Message (Target a) -> f (Message (Target a)))
-> (f (Target a, IsModeSet, [Target a], [Target a])
    -> f (Message (Target a)))
-> Either
     (Message (Target a))
     (f (Target a, IsModeSet, [Target a], [Target a]))
-> f (Message (Target a))
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either Message (Target a) -> f (Message (Target a))
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((f (Target a, IsModeSet, [Target a], [Target a])
  -> f (Message (Target a)))
 -> Either
      (Message (Target a))
      (f (Target a, IsModeSet, [Target a], [Target a]))
 -> f (Message (Target a)))
-> (f (Target a, IsModeSet, [Target a], [Target a])
    -> f (Message (Target a)))
-> Either
     (Message (Target a))
     (f (Target a, IsModeSet, [Target a], [Target a]))
-> f (Message (Target a))
forall a b. (a -> b) -> a -> b
$ ((Target a, IsModeSet, [Target a], [Target a])
 -> Message (Target a))
-> f (Target a, IsModeSet, [Target a], [Target a])
-> f (Message (Target a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\(Target a
t,IsModeSet
i,[Target a]
f,[Target a]
a) -> Target a
-> IsModeSet -> [Target a] -> [Target a] -> Message (Target a)
forall a.
Target a
-> IsModeSet -> [Target a] -> [Target a] -> Message (Target a)
Mode Target a
t IsModeSet
i [Target a]
f [Target a]
a)) (p (Either
      (Message (Target a)) (Target a, IsModeSet, [Target a], [Target a]))
   (Either
      (Message (Target a))
      (f (Target a, IsModeSet, [Target a], [Target a])))
 -> p (Message (Target a)) (f (Message (Target a))))
-> (p (Target a, IsModeSet, [Target a], [Target a])
      (f (Target a, IsModeSet, [Target a], [Target a]))
    -> p (Either
            (Message (Target a)) (Target a, IsModeSet, [Target a], [Target a]))
         (Either
            (Message (Target a))
            (f (Target a, IsModeSet, [Target a], [Target a]))))
-> p (Target a, IsModeSet, [Target a], [Target a])
     (f (Target a, IsModeSet, [Target a], [Target a]))
-> p (Message (Target a)) (f (Message (Target a)))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. p (Target a, IsModeSet, [Target a], [Target a])
  (f (Target a, IsModeSet, [Target a], [Target a]))
-> p (Either
        (Message (Target a)) (Target a, IsModeSet, [Target a], [Target a]))
     (Either
        (Message (Target a))
        (f (Target a, IsModeSet, [Target a], [Target a])))
forall (p :: * -> * -> *) a b c.
Choice p =>
p a b -> p (Either c a) (Either c b)
right'

-- | 'Prism' for 'Topic'
_Topic :: Prism' (Message a) (ChannelName a, a)
{-# INLINE _Topic #-}
_Topic :: p (ChannelName a, ChannelName a) (f (ChannelName a, ChannelName a))
-> p (Message (ChannelName a)) (f (Message (ChannelName a)))
_Topic = (Message (ChannelName a)
 -> Either (Message (ChannelName a)) (ChannelName a, ChannelName a))
-> (Either
      (Message (ChannelName a)) (f (ChannelName a, ChannelName a))
    -> f (Message (ChannelName a)))
-> p (Either
        (Message (ChannelName a)) (ChannelName a, ChannelName a))
     (Either
        (Message (ChannelName a)) (f (ChannelName a, ChannelName a)))
-> p (Message (ChannelName a)) (f (Message (ChannelName a)))
forall (p :: * -> * -> *) a b c d.
Profunctor p =>
(a -> b) -> (c -> d) -> p b c -> p a d
dimap
  (\Message (ChannelName a)
s -> case Message (ChannelName a)
s of Topic ChannelName a
c ChannelName a
t -> (ChannelName a, ChannelName a)
-> Either (Message (ChannelName a)) (ChannelName a, ChannelName a)
forall a b. b -> Either a b
Right (ChannelName a
c,ChannelName a
t); Message (ChannelName a)
_ -> Message (ChannelName a)
-> Either (Message (ChannelName a)) (ChannelName a, ChannelName a)
forall a b. a -> Either a b
Left Message (ChannelName a)
s)
  ((Message (ChannelName a) -> f (Message (ChannelName a)))
-> (f (ChannelName a, ChannelName a)
    -> f (Message (ChannelName a)))
-> Either
     (Message (ChannelName a)) (f (ChannelName a, ChannelName a))
-> f (Message (ChannelName a))
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either Message (ChannelName a) -> f (Message (ChannelName a))
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((f (ChannelName a, ChannelName a) -> f (Message (ChannelName a)))
 -> Either
      (Message (ChannelName a)) (f (ChannelName a, ChannelName a))
 -> f (Message (ChannelName a)))
-> (f (ChannelName a, ChannelName a)
    -> f (Message (ChannelName a)))
-> Either
     (Message (ChannelName a)) (f (ChannelName a, ChannelName a))
-> f (Message (ChannelName a))
forall a b. (a -> b) -> a -> b
$ ((ChannelName a, ChannelName a) -> Message (ChannelName a))
-> f (ChannelName a, ChannelName a) -> f (Message (ChannelName a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((ChannelName a -> ChannelName a -> Message (ChannelName a))
-> (ChannelName a, ChannelName a) -> Message (ChannelName a)
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry ChannelName a -> ChannelName a -> Message (ChannelName a)
forall a. Target a -> Target a -> Message (Target a)
Topic)) (p (Either
      (Message (ChannelName a)) (ChannelName a, ChannelName a))
   (Either
      (Message (ChannelName a)) (f (ChannelName a, ChannelName a)))
 -> p (Message (ChannelName a)) (f (Message (ChannelName a))))
-> (p (ChannelName a, ChannelName a)
      (f (ChannelName a, ChannelName a))
    -> p (Either
            (Message (ChannelName a)) (ChannelName a, ChannelName a))
         (Either
            (Message (ChannelName a)) (f (ChannelName a, ChannelName a))))
-> p (ChannelName a, ChannelName a)
     (f (ChannelName a, ChannelName a))
-> p (Message (ChannelName a)) (f (Message (ChannelName a)))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. p (ChannelName a, ChannelName a) (f (ChannelName a, ChannelName a))
-> p (Either
        (Message (ChannelName a)) (ChannelName a, ChannelName a))
     (Either
        (Message (ChannelName a)) (f (ChannelName a, ChannelName a)))
forall (p :: * -> * -> *) a b c.
Choice p =>
p a b -> p (Either c a) (Either c b)
right'

-- | 'Prism' for 'Invite'
_Invite :: Prism' (Message a) (ChannelName a, NickName a)
{-# INLINE _Invite #-}
_Invite :: p (ChannelName a, ChannelName a) (f (ChannelName a, ChannelName a))
-> p (Message (ChannelName a)) (f (Message (ChannelName a)))
_Invite = (Message (ChannelName a)
 -> Either (Message (ChannelName a)) (ChannelName a, ChannelName a))
-> (Either
      (Message (ChannelName a)) (f (ChannelName a, ChannelName a))
    -> f (Message (ChannelName a)))
-> p (Either
        (Message (ChannelName a)) (ChannelName a, ChannelName a))
     (Either
        (Message (ChannelName a)) (f (ChannelName a, ChannelName a)))
-> p (Message (ChannelName a)) (f (Message (ChannelName a)))
forall (p :: * -> * -> *) a b c d.
Profunctor p =>
(a -> b) -> (c -> d) -> p b c -> p a d
dimap
  (\Message (ChannelName a)
s -> case Message (ChannelName a)
s of Invite ChannelName a
c ChannelName a
n -> (ChannelName a, ChannelName a)
-> Either (Message (ChannelName a)) (ChannelName a, ChannelName a)
forall a b. b -> Either a b
Right (ChannelName a
c,ChannelName a
n); Message (ChannelName a)
_ -> Message (ChannelName a)
-> Either (Message (ChannelName a)) (ChannelName a, ChannelName a)
forall a b. a -> Either a b
Left Message (ChannelName a)
s)
  ((Message (ChannelName a) -> f (Message (ChannelName a)))
-> (f (ChannelName a, ChannelName a)
    -> f (Message (ChannelName a)))
-> Either
     (Message (ChannelName a)) (f (ChannelName a, ChannelName a))
-> f (Message (ChannelName a))
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either Message (ChannelName a) -> f (Message (ChannelName a))
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((f (ChannelName a, ChannelName a) -> f (Message (ChannelName a)))
 -> Either
      (Message (ChannelName a)) (f (ChannelName a, ChannelName a))
 -> f (Message (ChannelName a)))
-> (f (ChannelName a, ChannelName a)
    -> f (Message (ChannelName a)))
-> Either
     (Message (ChannelName a)) (f (ChannelName a, ChannelName a))
-> f (Message (ChannelName a))
forall a b. (a -> b) -> a -> b
$ ((ChannelName a, ChannelName a) -> Message (ChannelName a))
-> f (ChannelName a, ChannelName a) -> f (Message (ChannelName a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((ChannelName a -> ChannelName a -> Message (ChannelName a))
-> (ChannelName a, ChannelName a) -> Message (ChannelName a)
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry ChannelName a -> ChannelName a -> Message (ChannelName a)
forall a. Target a -> Target a -> Message (Target a)
Invite)) (p (Either
      (Message (ChannelName a)) (ChannelName a, ChannelName a))
   (Either
      (Message (ChannelName a)) (f (ChannelName a, ChannelName a)))
 -> p (Message (ChannelName a)) (f (Message (ChannelName a))))
-> (p (ChannelName a, ChannelName a)
      (f (ChannelName a, ChannelName a))
    -> p (Either
            (Message (ChannelName a)) (ChannelName a, ChannelName a))
         (Either
            (Message (ChannelName a)) (f (ChannelName a, ChannelName a))))
-> p (ChannelName a, ChannelName a)
     (f (ChannelName a, ChannelName a))
-> p (Message (ChannelName a)) (f (Message (ChannelName a)))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. p (ChannelName a, ChannelName a) (f (ChannelName a, ChannelName a))
-> p (Either
        (Message (ChannelName a)) (ChannelName a, ChannelName a))
     (Either
        (Message (ChannelName a)) (f (ChannelName a, ChannelName a)))
forall (p :: * -> * -> *) a b c.
Choice p =>
p a b -> p (Either c a) (Either c b)
right'

-- | 'Prism' for 'Kick'
_Kick :: Prism' (Message a) (ChannelName a, NickName a, Reason a)
{-# INLINE _Kick #-}
_Kick :: p (ChannelName a, ChannelName a, Reason (ChannelName a))
  (f (ChannelName a, ChannelName a, Reason (ChannelName a)))
-> p (Message (ChannelName a)) (f (Message (ChannelName a)))
_Kick = (Message (ChannelName a)
 -> Either
      (Message (ChannelName a))
      (ChannelName a, ChannelName a, Reason (ChannelName a)))
-> (Either
      (Message (ChannelName a))
      (f (ChannelName a, ChannelName a, Reason (ChannelName a)))
    -> f (Message (ChannelName a)))
-> p (Either
        (Message (ChannelName a))
        (ChannelName a, ChannelName a, Reason (ChannelName a)))
     (Either
        (Message (ChannelName a))
        (f (ChannelName a, ChannelName a, Reason (ChannelName a))))
-> p (Message (ChannelName a)) (f (Message (ChannelName a)))
forall (p :: * -> * -> *) a b c d.
Profunctor p =>
(a -> b) -> (c -> d) -> p b c -> p a d
dimap
  (\Message (ChannelName a)
s -> case Message (ChannelName a)
s of Kick ChannelName a
c ChannelName a
n Reason (ChannelName a)
r -> (ChannelName a, ChannelName a, Reason (ChannelName a))
-> Either
     (Message (ChannelName a))
     (ChannelName a, ChannelName a, Reason (ChannelName a))
forall a b. b -> Either a b
Right (ChannelName a
c,ChannelName a
n,Reason (ChannelName a)
r); Message (ChannelName a)
_ -> Message (ChannelName a)
-> Either
     (Message (ChannelName a))
     (ChannelName a, ChannelName a, Reason (ChannelName a))
forall a b. a -> Either a b
Left Message (ChannelName a)
s)
  ((Message (ChannelName a) -> f (Message (ChannelName a)))
-> (f (ChannelName a, ChannelName a, Reason (ChannelName a))
    -> f (Message (ChannelName a)))
-> Either
     (Message (ChannelName a))
     (f (ChannelName a, ChannelName a, Reason (ChannelName a)))
-> f (Message (ChannelName a))
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either Message (ChannelName a) -> f (Message (ChannelName a))
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((f (ChannelName a, ChannelName a, Reason (ChannelName a))
  -> f (Message (ChannelName a)))
 -> Either
      (Message (ChannelName a))
      (f (ChannelName a, ChannelName a, Reason (ChannelName a)))
 -> f (Message (ChannelName a)))
-> (f (ChannelName a, ChannelName a, Reason (ChannelName a))
    -> f (Message (ChannelName a)))
-> Either
     (Message (ChannelName a))
     (f (ChannelName a, ChannelName a, Reason (ChannelName a)))
-> f (Message (ChannelName a))
forall a b. (a -> b) -> a -> b
$ ((ChannelName a, ChannelName a, Reason (ChannelName a))
 -> Message (ChannelName a))
-> f (ChannelName a, ChannelName a, Reason (ChannelName a))
-> f (Message (ChannelName a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\(ChannelName a
c,ChannelName a
n,Reason (ChannelName a)
r) -> ChannelName a
-> ChannelName a
-> Reason (ChannelName a)
-> Message (ChannelName a)
forall a.
Target a -> Target a -> Reason (Target a) -> Message (Target a)
Kick ChannelName a
c ChannelName a
n Reason (ChannelName a)
r)) (p (Either
      (Message (ChannelName a))
      (ChannelName a, ChannelName a, Reason (ChannelName a)))
   (Either
      (Message (ChannelName a))
      (f (ChannelName a, ChannelName a, Reason (ChannelName a))))
 -> p (Message (ChannelName a)) (f (Message (ChannelName a))))
-> (p (ChannelName a, ChannelName a, Reason (ChannelName a))
      (f (ChannelName a, ChannelName a, Reason (ChannelName a)))
    -> p (Either
            (Message (ChannelName a))
            (ChannelName a, ChannelName a, Reason (ChannelName a)))
         (Either
            (Message (ChannelName a))
            (f (ChannelName a, ChannelName a, Reason (ChannelName a)))))
-> p (ChannelName a, ChannelName a, Reason (ChannelName a))
     (f (ChannelName a, ChannelName a, Reason (ChannelName a)))
-> p (Message (ChannelName a)) (f (Message (ChannelName a)))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. p (ChannelName a, ChannelName a, Reason (ChannelName a))
  (f (ChannelName a, ChannelName a, Reason (ChannelName a)))
-> p (Either
        (Message (ChannelName a))
        (ChannelName a, ChannelName a, Reason (ChannelName a)))
     (Either
        (Message (ChannelName a))
        (f (ChannelName a, ChannelName a, Reason (ChannelName a))))
forall (p :: * -> * -> *) a b c.
Choice p =>
p a b -> p (Either c a) (Either c b)
right'

-- | 'Prism' for 'Ping'
_Ping :: Prism' (Message a) (ServerName a, Maybe (ServerName a))
{-# INLINE _Ping #-}
_Ping :: p (ServerName a, Maybe (ServerName a))
  (f (ServerName a, Maybe (ServerName a)))
-> p (Message (ServerName a)) (f (Message (ServerName a)))
_Ping = (Message (ServerName a)
 -> Either
      (Message (ServerName a)) (ServerName a, Maybe (ServerName a)))
-> (Either
      (Message (ServerName a)) (f (ServerName a, Maybe (ServerName a)))
    -> f (Message (ServerName a)))
-> p (Either
        (Message (ServerName a)) (ServerName a, Maybe (ServerName a)))
     (Either
        (Message (ServerName a)) (f (ServerName a, Maybe (ServerName a))))
-> p (Message (ServerName a)) (f (Message (ServerName a)))
forall (p :: * -> * -> *) a b c d.
Profunctor p =>
(a -> b) -> (c -> d) -> p b c -> p a d
dimap
  (\Message (ServerName a)
s -> case Message (ServerName a)
s of Ping ServerName a
x Maybe (ServerName a)
y -> (ServerName a, Maybe (ServerName a))
-> Either
     (Message (ServerName a)) (ServerName a, Maybe (ServerName a))
forall a b. b -> Either a b
Right (ServerName a
x,Maybe (ServerName a)
y); Message (ServerName a)
_ -> Message (ServerName a)
-> Either
     (Message (ServerName a)) (ServerName a, Maybe (ServerName a))
forall a b. a -> Either a b
Left Message (ServerName a)
s)
  ((Message (ServerName a) -> f (Message (ServerName a)))
-> (f (ServerName a, Maybe (ServerName a))
    -> f (Message (ServerName a)))
-> Either
     (Message (ServerName a)) (f (ServerName a, Maybe (ServerName a)))
-> f (Message (ServerName a))
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either Message (ServerName a) -> f (Message (ServerName a))
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((f (ServerName a, Maybe (ServerName a))
  -> f (Message (ServerName a)))
 -> Either
      (Message (ServerName a)) (f (ServerName a, Maybe (ServerName a)))
 -> f (Message (ServerName a)))
-> (f (ServerName a, Maybe (ServerName a))
    -> f (Message (ServerName a)))
-> Either
     (Message (ServerName a)) (f (ServerName a, Maybe (ServerName a)))
-> f (Message (ServerName a))
forall a b. (a -> b) -> a -> b
$ ((ServerName a, Maybe (ServerName a)) -> Message (ServerName a))
-> f (ServerName a, Maybe (ServerName a))
-> f (Message (ServerName a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((ServerName a -> Maybe (ServerName a) -> Message (ServerName a))
-> (ServerName a, Maybe (ServerName a)) -> Message (ServerName a)
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry ServerName a -> Maybe (ServerName a) -> Message (ServerName a)
forall a. Target a -> Reason (Target a) -> Message (Target a)
Ping)) (p (Either
      (Message (ServerName a)) (ServerName a, Maybe (ServerName a)))
   (Either
      (Message (ServerName a)) (f (ServerName a, Maybe (ServerName a))))
 -> p (Message (ServerName a)) (f (Message (ServerName a))))
-> (p (ServerName a, Maybe (ServerName a))
      (f (ServerName a, Maybe (ServerName a)))
    -> p (Either
            (Message (ServerName a)) (ServerName a, Maybe (ServerName a)))
         (Either
            (Message (ServerName a)) (f (ServerName a, Maybe (ServerName a)))))
-> p (ServerName a, Maybe (ServerName a))
     (f (ServerName a, Maybe (ServerName a)))
-> p (Message (ServerName a)) (f (Message (ServerName a)))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. p (ServerName a, Maybe (ServerName a))
  (f (ServerName a, Maybe (ServerName a)))
-> p (Either
        (Message (ServerName a)) (ServerName a, Maybe (ServerName a)))
     (Either
        (Message (ServerName a)) (f (ServerName a, Maybe (ServerName a))))
forall (p :: * -> * -> *) a b c.
Choice p =>
p a b -> p (Either c a) (Either c b)
right'

-- | 'Prism' for 'Pong'
_Pong :: Prism' (Message a) (ServerName a)
{-# INLINE _Pong #-}
_Pong :: p (ServerName a) (f (ServerName a))
-> p (Message (ServerName a)) (f (Message (ServerName a)))
_Pong = (Message (ServerName a)
 -> Either (Message (ServerName a)) (ServerName a))
-> (Either (Message (ServerName a)) (f (ServerName a))
    -> f (Message (ServerName a)))
-> p (Either (Message (ServerName a)) (ServerName a))
     (Either (Message (ServerName a)) (f (ServerName a)))
-> p (Message (ServerName a)) (f (Message (ServerName a)))
forall (p :: * -> * -> *) a b c d.
Profunctor p =>
(a -> b) -> (c -> d) -> p b c -> p a d
dimap
  (\Message (ServerName a)
s -> case Message (ServerName a)
s of Pong ServerName a
x -> ServerName a -> Either (Message (ServerName a)) (ServerName a)
forall a b. b -> Either a b
Right ServerName a
x; Message (ServerName a)
_ -> Message (ServerName a)
-> Either (Message (ServerName a)) (ServerName a)
forall a b. a -> Either a b
Left Message (ServerName a)
s)
  ((Message (ServerName a) -> f (Message (ServerName a)))
-> (f (ServerName a) -> f (Message (ServerName a)))
-> Either (Message (ServerName a)) (f (ServerName a))
-> f (Message (ServerName a))
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either Message (ServerName a) -> f (Message (ServerName a))
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((f (ServerName a) -> f (Message (ServerName a)))
 -> Either (Message (ServerName a)) (f (ServerName a))
 -> f (Message (ServerName a)))
-> (f (ServerName a) -> f (Message (ServerName a)))
-> Either (Message (ServerName a)) (f (ServerName a))
-> f (Message (ServerName a))
forall a b. (a -> b) -> a -> b
$ (ServerName a -> Message (ServerName a))
-> f (ServerName a) -> f (Message (ServerName a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ServerName a -> Message (ServerName a)
forall a. Target a -> Message (Target a)
Pong) (p (Either (Message (ServerName a)) (ServerName a))
   (Either (Message (ServerName a)) (f (ServerName a)))
 -> p (Message (ServerName a)) (f (Message (ServerName a))))
-> (p (ServerName a) (f (ServerName a))
    -> p (Either (Message (ServerName a)) (ServerName a))
         (Either (Message (ServerName a)) (f (ServerName a))))
-> p (ServerName a) (f (ServerName a))
-> p (Message (ServerName a)) (f (Message (ServerName a)))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. p (ServerName a) (f (ServerName a))
-> p (Either (Message (ServerName a)) (ServerName a))
     (Either (Message (ServerName a)) (f (ServerName a)))
forall (p :: * -> * -> *) a b c.
Choice p =>
p a b -> p (Either c a) (Either c b)
right'

-- | 'Prism' for 'Numeric'
_Numeric :: Prism' (Message a) (Int, [NumericArg a])
{-# INLINE _Numeric #-}
_Numeric :: p (Int, [NumericArg a]) (f (Int, [NumericArg a]))
-> p (Message (NumericArg a)) (f (Message (NumericArg a)))
_Numeric = (Message (NumericArg a)
 -> Either (Message (NumericArg a)) (Int, [NumericArg a]))
-> (Either (Message (NumericArg a)) (f (Int, [NumericArg a]))
    -> f (Message (NumericArg a)))
-> p (Either (Message (NumericArg a)) (Int, [NumericArg a]))
     (Either (Message (NumericArg a)) (f (Int, [NumericArg a])))
-> p (Message (NumericArg a)) (f (Message (NumericArg a)))
forall (p :: * -> * -> *) a b c d.
Profunctor p =>
(a -> b) -> (c -> d) -> p b c -> p a d
dimap
  (\Message (NumericArg a)
s -> case Message (NumericArg a)
s of Numeric Int
n [NumericArg a]
a -> (Int, [NumericArg a])
-> Either (Message (NumericArg a)) (Int, [NumericArg a])
forall a b. b -> Either a b
Right (Int
n,[NumericArg a]
a); Message (NumericArg a)
_ -> Message (NumericArg a)
-> Either (Message (NumericArg a)) (Int, [NumericArg a])
forall a b. a -> Either a b
Left Message (NumericArg a)
s)
  ((Message (NumericArg a) -> f (Message (NumericArg a)))
-> (f (Int, [NumericArg a]) -> f (Message (NumericArg a)))
-> Either (Message (NumericArg a)) (f (Int, [NumericArg a]))
-> f (Message (NumericArg a))
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either Message (NumericArg a) -> f (Message (NumericArg a))
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((f (Int, [NumericArg a]) -> f (Message (NumericArg a)))
 -> Either (Message (NumericArg a)) (f (Int, [NumericArg a]))
 -> f (Message (NumericArg a)))
-> (f (Int, [NumericArg a]) -> f (Message (NumericArg a)))
-> Either (Message (NumericArg a)) (f (Int, [NumericArg a]))
-> f (Message (NumericArg a))
forall a b. (a -> b) -> a -> b
$ ((Int, [NumericArg a]) -> Message (NumericArg a))
-> f (Int, [NumericArg a]) -> f (Message (NumericArg a))
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Int -> [NumericArg a] -> Message (NumericArg a))
-> (Int, [NumericArg a]) -> Message (NumericArg a)
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Int -> [NumericArg a] -> Message (NumericArg a)
forall a. Int -> [Target a] -> Message (Target a)
Numeric)) (p (Either (Message (NumericArg a)) (Int, [NumericArg a]))
   (Either (Message (NumericArg a)) (f (Int, [NumericArg a])))
 -> p (Message (NumericArg a)) (f (Message (NumericArg a))))
-> (p (Int, [NumericArg a]) (f (Int, [NumericArg a]))
    -> p (Either (Message (NumericArg a)) (Int, [NumericArg a]))
         (Either (Message (NumericArg a)) (f (Int, [NumericArg a]))))
-> p (Int, [NumericArg a]) (f (Int, [NumericArg a]))
-> p (Message (NumericArg a)) (f (Message (NumericArg a)))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. p (Int, [NumericArg a]) (f (Int, [NumericArg a]))
-> p (Either (Message (NumericArg a)) (Int, [NumericArg a]))
     (Either (Message (NumericArg a)) (f (Int, [NumericArg a])))
forall (p :: * -> * -> *) a b c.
Choice p =>
p a b -> p (Either c a) (Either c b)
right'

-- | 'Prism' for 'RawMsg'
_RawMsg :: Prism' (Message a) a
{-# INLINE _RawMsg #-}
_RawMsg :: p a (f a) -> p (Message a) (f (Message a))
_RawMsg = (Message a -> Either (Message a) a)
-> (Either (Message a) (f a) -> f (Message a))
-> p (Either (Message a) a) (Either (Message a) (f a))
-> p (Message a) (f (Message a))
forall (p :: * -> * -> *) a b c d.
Profunctor p =>
(a -> b) -> (c -> d) -> p b c -> p a d
dimap
  (\Message a
s -> case Message a
s of RawMsg a
a -> a -> Either (Message a) a
forall a b. b -> Either a b
Right a
a; Message a
_ -> Message a -> Either (Message a) a
forall a b. a -> Either a b
Left Message a
s)
  ((Message a -> f (Message a))
-> (f a -> f (Message a))
-> Either (Message a) (f a)
-> f (Message a)
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either Message a -> f (Message a)
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((f a -> f (Message a))
 -> Either (Message a) (f a) -> f (Message a))
-> (f a -> f (Message a))
-> Either (Message a) (f a)
-> f (Message a)
forall a b. (a -> b) -> a -> b
$ (a -> Message a) -> f a -> f (Message a)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> Message a
forall a. Target a -> Message (Target a)
RawMsg) (p (Either (Message a) a) (Either (Message a) (f a))
 -> p (Message a) (f (Message a)))
-> (p a (f a)
    -> p (Either (Message a) a) (Either (Message a) (f a)))
-> p a (f a)
-> p (Message a) (f (Message a))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. p a (f a) -> p (Either (Message a) a) (Either (Message a) (f a))
forall (p :: * -> * -> *) a b c.
Choice p =>
p a b -> p (Either c a) (Either c b)
right'