aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Plugin/Factorial.hs29
-rw-r--r--src/PluginList.hs4
2 files changed, 32 insertions, 1 deletions
diff --git a/src/Plugin/Factorial.hs b/src/Plugin/Factorial.hs
new file mode 100644
index 0000000..f8cfee2
--- /dev/null
+++ b/src/Plugin/Factorial.hs
@@ -0,0 +1,29 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+module Plugin.Factorial
+ ( factorial
+ ) where
+
+import Text.Regex.TDFA ((=~))
+import TextShow (showt)
+
+import qualified Message as M
+import Plugin.Base
+
+factorial = Plugin
+ { matchRegex = "^([0-9]+)!$"
+ , perform = factorialAction
+ , command = "<integer>!"
+ , description = "Calculate the factorial of <integer>"
+ }
+
+factorialAction :: PluginAction
+factorialAction message = do
+ case M.textStr message =~ matchRegex factorial :: [[String]] of
+ [] -> return $ Left "I didn't understand"
+ (m:_) -> do
+ let number = last m
+ return $ Right $ showt $ calculate $ (read number :: Int)
+
+calculate :: (Enum a, Num a) => a -> a
+calculate n = product [1..n]
diff --git a/src/PluginList.hs b/src/PluginList.hs
index bfcae7e..7c950c0 100644
--- a/src/PluginList.hs
+++ b/src/PluginList.hs
@@ -3,6 +3,7 @@ module PluginList
) where
import Plugin.Base (Plugin)
+import Plugin.Factorial
import Plugin.GitHubCommit
import Plugin.GitRemoteSetOrigin
@@ -10,6 +11,7 @@ import Plugin.GitRemoteSetOrigin
-- cause a circular import.
plugins :: [Plugin]
plugins =
- [ gitHubCommit
+ [ factorial
+ , gitHubCommit
, gitRemoteSetOrigin
]