packages feed

irc-fun-messages-0.4: src/Network/Irc/Messages/Internal/Util.hs

{- This file is part of irc-fun-messages.
 -
 - Written in 2015 by fr33domlover <fr33domlover@rel4tion.org>.
 -
 - ♡ Copying is an act of love. Please copy, reuse and share.
 -
 - The author(s) have dedicated all copyright and related and neighboring
 - rights to this software to the public domain worldwide. This software is
 - distributed without any warranty.
 -
 - You should have received a copy of the CC0 Public Domain Dedication along
 - with this software. If not, see
 - <http://creativecommons.org/publicdomain/zero/1.0/>.
 -}

module Network.Irc.Messages.Internal.Util
    ( showt
    , listOf
    , req0
    , req1
    , req2
    , req3
    , req4
    , req5
    , req6
    , req0m1
    , req1m2
    , req2m3
    , req3m4
    , min1
    )
where

import Data.Text (Text, pack)
import Network.Irc.Messages.Internal.Types
import Network.Irc.Types
import Text.Regex.Applicative

showt :: Int -> Text
showt = pack . show

listOf :: Regex a -> Regex [a]
listOf re = (:) <$> re <*> many (sym ',' *> re)

req0 :: [Parameter]
     -> Either AnalysisError Message
     -> Either AnalysisError Message
req0 [] f = f
req0 l  _ = Left $ WrongNumArgs (length l) (Just $ Exactly 0)

req1 :: [Parameter]
     -> (Parameter -> Either AnalysisError Message)
     -> Either AnalysisError Message
req1 [p1] f = f p1
req1 l    _ = Left $ WrongNumArgs (length l) (Just $ Exactly 1)

req2 :: [Parameter]
     -> (Parameter -> Parameter -> Either AnalysisError Message)
     -> Either AnalysisError Message
req2 [p1, p2] f = f p1 p2
req2 l        _ = Left $ WrongNumArgs (length l) (Just $ Exactly 2)

req3 :: [Parameter]
     -> (Parameter -> Parameter -> Parameter -> Either AnalysisError Message)
     -> Either AnalysisError Message
req3 [p1, p2, p3] f = f p1 p2 p3
req3 l            _ = Left $ WrongNumArgs (length l) (Just $ Exactly 3)

req4 :: [Parameter]
     -> (  Parameter
        -> Parameter
        -> Parameter
        -> Parameter
        -> Either AnalysisError Message
        )
     -> Either AnalysisError Message
req4 [p1, p2, p3, p4] f = f p1 p2 p3 p4
req4 l            _     = Left $ WrongNumArgs (length l) (Just $ Exactly 4)

req5 :: [Parameter]
     -> (  Parameter
        -> Parameter
        -> Parameter
        -> Parameter
        -> Parameter
        -> Either AnalysisError Message
        )
     -> Either AnalysisError Message
req5 [p1, p2, p3, p4, p5] f = f p1 p2 p3 p4 p5
req5 l                    _ = Left $ WrongNumArgs (length l) (Just $ Exactly 5)

req6 :: [Parameter]
     -> (  Parameter
        -> Parameter
        -> Parameter
        -> Parameter
        -> Parameter
        -> Parameter
        -> Either AnalysisError Message
        )
     -> Either AnalysisError Message
req6 [p1, p2, p3, p4, p5,p6] f = f p1 p2 p3 p4 p5 p6
req6 l                       _ = Left $
                                 WrongNumArgs (length l) (Just $ Exactly 6)

req0m1 :: [Parameter]
       -> (Maybe Parameter -> Either AnalysisError Message)
       -> Either AnalysisError Message
req0m1 [] f   = f Nothing
req0m1 [p1] f = f $ Just p1
req0m1 l    _ = Left $ WrongNumArgs (length l) (Just $ Between 0 1)

req1m2 :: [Parameter]
       -> (Parameter -> Maybe Parameter -> Either AnalysisError Message)
       -> Either AnalysisError Message
req1m2 [p1]     f = f p1 Nothing
req1m2 [p1, p2] f = f p1 (Just p2)
req1m2 l        _ = Left $ WrongNumArgs (length l) (Just $ Between 1 2)

req2m3 :: [Parameter]
       -> (  Parameter
          -> Parameter
          -> Maybe Parameter
          -> Either AnalysisError Message
          )
       -> Either AnalysisError Message
req2m3 [p1, p2]     f = f p1 p2 Nothing
req2m3 [p1, p2, p3] f = f p1 p2 (Just p3)
req2m3 l            _ = Left $ WrongNumArgs (length l) (Just $ Between 2 3)

req3m4 :: [Parameter]
       -> (  Parameter
          -> Parameter
          -> Parameter
          -> Maybe Parameter
          -> Either AnalysisError Message
          )
       -> Either AnalysisError Message
req3m4 [p1, p2, p3]     f = f p1 p2 p3 Nothing
req3m4 [p1, p2, p3, p4] f = f p1 p2 p3 (Just p4)
req3m4 l                _ = Left $
                            WrongNumArgs (length l) (Just $ Between 3 4)

min1 :: [Parameter]
     -> (Parameter -> [Parameter] -> Either AnalysisError Message)
     -> Either AnalysisError Message
min1 []      _ = Left $ WrongNumArgs 0 (Just $ AtLeast 1)
min1 (p1:ps) f = f p1 ps