From 0d55d50a30554e707f499b5814b54e8643d93354 Mon Sep 17 00:00:00 2001 From: Kjetil Orbekk Date: Wed, 15 Feb 2017 22:52:26 -0500 Subject: Add dispatch stuff. --- Dispatch.idr | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 Dispatch.idr diff --git a/Dispatch.idr b/Dispatch.idr new file mode 100644 index 0000000..a13fef4 --- /dev/null +++ b/Dispatch.idr @@ -0,0 +1,53 @@ +module Main + +%default total + +data Matcher = + Directory String Matcher + | Capture Matcher + | End + +HandlerType : Matcher -> Type +HandlerType (Directory s m) = HandlerType m +HandlerType (Capture m) = String -> HandlerType m +HandlerType End = String + +Handler : Type +Handler = (m : Matcher ** HandlerType m) + +dispatch : (handlers : List Handler) -> String -> Maybe String +dispatch [] _ = Nothing +dispatch handlers path = go handlers components where + components : List String + components = filter (/="") (split (=='/') path) + + go : List Handler -> List String -> Maybe String + go [] cs = Nothing + go ((m ** f) :: hs) cs = + let next = go hs cs in + case m of + Directory dir matcher => case cs of + (c :: cs') => if c == dir then go ((matcher ** f) :: hs) cs' else next + _ => next + Capture matcher => case cs of + (c :: cs') => go ((matcher ** f c) :: hs) cs' + _ => next + End => Just f + +helloHandler : String -> String -> String +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) + ] + +partial +main : IO () +main = do + putStrLn (fromMaybe "failed" $ dispatch handlers "hello/Bob/Sunshine") + putStrLn (fromMaybe "failed" $ dispatch handlers "weather/New York") -- cgit v1.2.3