{-# 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