{-# LANGUAGE TypeOperators #-} module Servant.Extra ( capture , left , right ) where import Data.Bifunctor (bimap) import Servant ((:<|>) ((:<|>))) capture :: ((a -> b) :<|> (a -> c)) -> a -> (b :<|> c) capture :: ((a -> b) :<|> (a -> c)) -> a -> b :<|> c capture (a -> b) :<|> (a -> c) handlers a arg = ((a -> b) -> b) -> ((a -> c) -> c) -> ((a -> b) :<|> (a -> c)) -> b :<|> c forall (p :: * -> * -> *) a b c d. Bifunctor p => (a -> b) -> (c -> d) -> p a c -> p b d bimap ((a -> b) -> a -> b forall a b. (a -> b) -> a -> b $ a arg) ((a -> c) -> a -> c forall a b. (a -> b) -> a -> b $ a arg) (a -> b) :<|> (a -> c) handlers left :: (a :<|> b) -> a left :: (a :<|> b) -> a left a :<|> b x = a l where (a l :<|> b _) = a :<|> b x right :: (a :<|> b) -> b right :: (a :<|> b) -> b right a :<|> b x = b r where (a _ :<|> b r) = a :<|> b x