1 {-# LANGUAGE GADTs, TupleSections, QuasiQuotes, TypeOperators #-} 2 module Databrary.HTTP.Path.Parser 3 ( PathParser 4 , (>$<) 5 , (</>) 6 , (</>>) 7 , (</>>>) 8 , (>/>) 9 , (</<) 10 , (|/|) 11 , pathMaybe 12 , (=/=) 13 ) where 14 15 import qualified Data.Invertible as I 16 import Web.Route.Invertible 17 18 type PathParser = Path 19 20 infixr 2 </>, </>>, </>>>, >/>, </< 21 (</>) :: PathParser a -> PathParser b -> PathParser (a, b) 22 (</>) = (>*<) 23 24 (</>>) :: PathParser a -> PathParser (b, c) -> PathParser (a, b, c) 25 (</>>) = (>*<<) 26 27 (</>>>) :: PathParser a -> PathParser (b, c, d) -> PathParser (a, b, c, d) 28 (</>>>) = (>*<<<) 29 30 (>/>) :: PathParser () -> PathParser a -> PathParser a 31 (>/>) = (*<) 32 33 (</<) :: PathParser a -> PathParser () -> PathParser a 34 (</<) = (>*) 35 36 infix 3 |/|, =/= 37 (|/|) :: PathParser a -> PathParser b -> PathParser (Either a b) 38 (|/|) = (>|<) 39 40 -- empty-biased version of 'optionalI' 41 pathMaybe :: PathParser a -> PathParser (Maybe a) 42 pathMaybe p = I.rgt >$< (unit |/| p) 43 44 (=/=) :: Eq a => a -> PathParser a -> PathParser a 45 (=/=) a p = I.fromMaybe a >$< pathMaybe p