{-# LANGUAGE StaticPointers #-} module Data.Profunctor.Choice.Static where import Control.Distributed.Closure import Data.Bifunctor (bimap) import Data.Profunctor.Static import Data.Typeable (Typeable) class StaticProfunctor p => StaticChoice p where staticLeft' :: (Typeable a, Typeable b, Typeable c) => p a b -> p (Either a c) (Either b c) staticRight' :: (Typeable a, Typeable b, Typeable c) => p a b -> p (Either c a) (Either c b) instance StaticChoice WrappedArrowClosure where staticLeft' (WrapArrowClosure sf) = WrapArrowClosure $ static (\f -> bimap f id) `cap` sf staticRight' (WrapArrowClosure sg) = WrapArrowClosure $ static (\g -> bimap id g) `cap` sg