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