summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKjetil Orbekk <kjetil.orbekk@gmail.com>2017-02-16 08:18:44 -0500
committerKjetil Orbekk <kjetil.orbekk@gmail.com>2017-02-16 08:18:44 -0500
commit03f09725cb5f162ae19eba5bba188f085a0c11a7 (patch)
treefb91917a4ede0ce3178c4b7fb6884e10886cfa99
parent65757403924d51f6cc32a30ad7282996ace61854 (diff)
Use an interface for dispatching.HEADmaster
-rw-r--r--Dispatch.idr30
1 files changed, 21 insertions, 9 deletions
diff --git a/Dispatch.idr b/Dispatch.idr
index d7a8f97..c9883ab 100644
--- a/Dispatch.idr
+++ b/Dispatch.idr
@@ -3,13 +3,25 @@ module Main
%default total
data Matcher =
- Directory String Matcher
- | Capture Matcher
+ MDirectory String Matcher
+ | MCapture Matcher
| End
+
+data Commands = Capture
+
+infixr 8 //
+interface Matchable a where
+ (//) : a -> Matcher -> Matcher
+Matchable String where
+ x // m = MDirectory x m
+
+Matchable Commands where
+ Capture // m = MCapture m
+
HandlerType : Matcher -> Type
-HandlerType (Directory s m) = HandlerType m
-HandlerType (Capture m) = String -> HandlerType m
+HandlerType (MDirectory s m) = HandlerType m
+HandlerType (MCapture m) = String -> HandlerType m
HandlerType End = String
Handler : Type
@@ -26,10 +38,10 @@ dispatch handlers path = go handlers components where
go ((m ** f) :: hs) cs =
let next = go hs cs in
case m of
- Directory dir matcher => case cs of
+ MDirectory dir matcher => case cs of
(c :: cs') => if c == dir then go ((matcher ** f) :: hs) cs' else next
_ => next
- Capture matcher => case cs of
+ MCapture matcher => case cs of
(c :: cs') => go ((matcher ** f c) :: hs) cs'
_ => next
End => Just f
@@ -39,11 +51,11 @@ helloHandler firstName lastName = "Hello, " ++ firstName ++ " " ++ lastName
weatherHandler : String -> String
weatherHandler place = "The weather in " ++ place ++ " is cold."
-
+
handlers : List Handler
handlers = [
- (Directory "hello" (Capture (Capture End)) ** helloHandler)
- , (Directory "weather" (Capture End) ** weatherHandler)
+ ("hello" // Capture // Capture // End ** helloHandler)
+ , ("weather" // Capture // End ** weatherHandler)
]
main : IO ()