0 | module TyTTP.URL.Search
2 | import Control.Monad.Either
7 | import TyTTP.URL.Definition
15 | SimpleSearch = List (String, String)
17 | parseString : String -> SimpleSearch
18 | parseString = parseSkipQuestionMarks . unpack
20 | parse : List Char -> SimpleSearch
23 | let sections = splitOn '&' xs
24 | params = break (== '=') <$> List.filter (not . null) (forget sections)
26 | bimap pack (pack . fromMaybe [] . tail') <$> params
28 | parseSkipQuestionMarks : List Char -> SimpleSearch
29 | parseSkipQuestionMarks [] = []
30 | parseSkipQuestionMarks ('?'::xs) = parseSkipQuestionMarks xs
31 | parseSkipQuestionMarks a@(x::xs) = parse a
37 | Context me (URL auth pth SimpleSearch) v h1 st h2 a b
38 | -> m $
Context me' (URL auth pth SimpleSearch) v' h1' st' h2' a' b'
40 | -> Context me (URL auth pth String) v h1 st h2 a b
41 | -> m $
Context me' (URL auth pth String) v' h1' st' h2' a' b'
42 | search handler ctx = do
43 | let src = parseString $
URL.search ctx.request.url
44 | result <- handler $
{ request.url := { search := src } ctx.request.url } ctx
45 | pure $
{ request.url := { search := ctx.request.url.search } result.request.url } result