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
#define PRIME() '
#define LENS(S,F,A) \
; \
; \
F :: Lens' S A; \
F = \ afb s -> (\ b -> s {_/**/F = b}) <$> afb (_/**/F s)
#define PRISM(S,C,ARG,TUP,A) \
; \
; \
_/**/C :: Prism' S A; \
_/**/C = dimap (\ s -> case s of C ARG -> Right TUP; _ -> Left s) \
(either pure $ fmap (\ TUP -> C ARG)) . right'
LENS((Event a),raw,ByteString)
LENS((Event a),source,(Source a))
LENS((Event a),message,(Message a))
PRISM((Source a),User,name,name,(NickName a))
PRISM((Source a),Channel,chan name,(chan,name),(ChannelName a, NickName a))
PRISM((Source a),Server,name,name,(ServerName a))
PRISM((Message a),Privmsg,tar msg,(tar, msg),(Target a, Either CTCPByteString a))
PRISM((Message a),Notice,tar msg,(tar, msg),(Target a, Either CTCPByteString a))
PRISM((Message a),Nick,name,name,(NickName a))
PRISM((Message a),Join,chan,chan,(ChannelName a))
PRISM((Message a),Part,chan reason,(chan, reason),(ChannelName a, Reason a))
PRISM((Message a),Quit,reason,reason,(Reason a))
PRISM((Message a),Mode,tar is flags args,(tar, is, flags, args),(Target a, IsModeSet, [ModeFlag a], [ModeArg a]))
PRISM((Message a),Topic,name topic,(name, topic),(ChannelName a, a))
PRISM((Message a),Invite,chan name,(chan, name),(ChannelName a, NickName a))
PRISM((Message a),Kick,chan name reason,(chan, name, reason),(ChannelName a, NickName a, Reason a))
PRISM((Message a),Ping,ser ver,(ser, ver),(ServerName a, Maybe (ServerName a)))
PRISM((Message a),Pong,ser,ser,(ServerName a))
PRISM((Message a),Numeric,num args,(num, args),(Int, [NumericArg a]))
PRISM((Message a),RawMsg,msg,msg,a)