-- |
-- 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.Conduit.Internal
import           Network.IRC.CTCP             (CTCPByteString)

-- * Lenses for 'Event'

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

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

-- | 'Lens' for '_message'.
message :: Lens' (Event a) (Message a)
{-# INLINE message #-}
message :: forall a. Lens' (Event a) (Message a)
message Message a -> f (Message a)
afb Event a
s = (\Message a
b -> Event a
s { _message :: Message a
_message = Message a
b }) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Message a -> f (Message a)
afb (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 :: forall a. Prism' (Source a) a
_User = 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 -> forall a b. b -> Either a b
Right NickName a
n; Source (NickName a)
_ -> forall a b. a -> Either a b
Left Source (NickName a)
s)
  (forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. NickName a -> Source (NickName a)
User) forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 :: forall a. Prism' (Source a) (a, a)
_Channel = 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 -> forall a b. b -> Either a b
Right (ChannelName a
c,ChannelName a
n); Source (ChannelName a)
_ -> forall a b. a -> Either a b
Left Source (ChannelName a)
s)
  (forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry forall a. NickName a -> NickName a -> Source (NickName a)
Channel)) forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 :: forall a. Prism' (Source a) a
_Server = 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 -> forall a b. b -> Either a b
Right ServerName a
n; Source (ServerName a)
_ -> forall a b. a -> Either a b
Left Source (ServerName a)
s)
  (forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. NickName a -> Source (NickName a)
Server) forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 :: forall a. Prism' (Message a) (a, Either CTCPByteString a)
_Privmsg = 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 -> forall a b. b -> Either a b
Right (Target a
t,Either CTCPByteString (Target a)
m); Message (Target a)
_ -> forall a b. a -> Either a b
Left Message (Target a)
s)
  (forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry forall a.
Target a -> Either CTCPByteString (Target a) -> Message (Target a)
Privmsg)) forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 :: forall a. Prism' (Message a) (a, Either CTCPByteString a)
_Notice = 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 -> forall a b. b -> Either a b
Right (Target a
t,Either CTCPByteString (Target a)
m); Message (Target a)
_ -> forall a b. a -> Either a b
Left Message (Target a)
s)
  (forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry forall a.
Target a -> Either CTCPByteString (Target a) -> Message (Target a)
Notice)) forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 :: forall a. Prism' (Message a) a
_Nick = 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 -> forall a b. b -> Either a b
Right NickName a
n; Message (NickName a)
_ -> forall a b. a -> Either a b
Left Message (NickName a)
s)
  (forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Target a -> Message (Target a)
Nick) forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 :: forall a. Prism' (Message a) a
_Join = 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 -> forall a b. b -> Either a b
Right ChannelName a
c; Message (ChannelName a)
_ -> forall a b. a -> Either a b
Left Message (ChannelName a)
s)
  (forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Target a -> Message (Target a)
Join) forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 :: forall a. Prism' (Message a) (a, Reason a)
_Part = 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 -> forall a b. b -> Either a b
Right (ChannelName a
c,Reason (ChannelName a)
r); Message (ChannelName a)
_ -> forall a b. a -> Either a b
Left Message (ChannelName a)
s)
  (forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry forall a. Target a -> Reason (Target a) -> Message (Target a)
Part)) forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 :: forall a. Prism' (Message a) (Reason a)
_Quit = 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 -> forall a b. b -> Either a b
Right Reason a
r; Message a
_ -> forall a b. a -> Either a b
Left Message a
s)
  (forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Reason (Target a) -> Message (Target a)
Quit) forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 :: forall a. Prism' (Message a) (a, IsModeSet, [a], [a])
_Mode = 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 -> forall a b. b -> Either a b
Right (Target a
t,IsModeSet
i,[Target a]
f,[Target a]
a); Message (Target a)
_ -> forall a b. a -> Either a b
Left Message (Target a)
s)
  (forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\(Target a
t,IsModeSet
i,[Target a]
f,[Target a]
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)) forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 :: forall a. Prism' (Message a) (a, a)
_Topic = 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 -> forall a b. b -> Either a b
Right (ChannelName a
c,ChannelName a
t); Message (ChannelName a)
_ -> forall a b. a -> Either a b
Left Message (ChannelName a)
s)
  (forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry forall a. Target a -> Target a -> Message (Target a)
Topic)) forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 :: forall a. Prism' (Message a) (a, a)
_Invite = 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 -> forall a b. b -> Either a b
Right (ChannelName a
c,ChannelName a
n); Message (ChannelName a)
_ -> forall a b. a -> Either a b
Left Message (ChannelName a)
s)
  (forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry forall a. Target a -> Target a -> Message (Target a)
Invite)) forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 :: forall a. Prism' (Message a) (a, a, Reason a)
_Kick = 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 -> forall a b. b -> Either a b
Right (ChannelName a
c,ChannelName a
n,Reason (ChannelName a)
r); Message (ChannelName a)
_ -> forall a b. a -> Either a b
Left Message (ChannelName a)
s)
  (forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\(ChannelName a
c,ChannelName a
n,Reason (ChannelName a)
r) -> forall a.
Target a -> Target a -> Reason (Target a) -> Message (Target a)
Kick ChannelName a
c ChannelName a
n Reason (ChannelName a)
r)) forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 :: forall a. Prism' (Message a) (a, Reason a)
_Ping = 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 -> forall a b. b -> Either a b
Right (ServerName a
x,Maybe (ServerName a)
y); Message (ServerName a)
_ -> forall a b. a -> Either a b
Left Message (ServerName a)
s)
  (forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry forall a. Target a -> Reason (Target a) -> Message (Target a)
Ping)) forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 :: forall a. Prism' (Message a) a
_Pong = 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 -> forall a b. b -> Either a b
Right ServerName a
x; Message (ServerName a)
_ -> forall a b. a -> Either a b
Left Message (ServerName a)
s)
  (forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Target a -> Message (Target a)
Pong) forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 :: forall a. Prism' (Message a) (Int, [a])
_Numeric = 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 -> forall a b. b -> Either a b
Right (Int
n,[NumericArg a]
a); Message (NumericArg a)
_ -> forall a b. a -> Either a b
Left Message (NumericArg a)
s)
  (forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry forall a. Int -> [Target a] -> Message (Target a)
Numeric)) forall b c a. (b -> c) -> (a -> b) -> a -> c
. 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 :: forall a. Prism' (Message a) a
_RawMsg = 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 -> forall a b. b -> Either a b
Right a
a; Message a
_ -> forall a b. a -> Either a b
Left Message a
s)
  (forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either forall (f :: * -> *) a. Applicative f => a -> f a
pure forall a b. (a -> b) -> a -> b
$ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap forall a. Target a -> Message (Target a)
RawMsg) forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall (p :: * -> * -> *) a b c.
Choice p =>
p a b -> p (Either c a) (Either c b)
right'