lets-lens/src/Lets/Lens/Choice.hs

44 lines
767 B
Haskell

module Lets.Lens.Choice
(
Choice(..)
) where
import Lets.Data
import Lets.Lens.Profunctor
diswap ::
Profunctor p =>
p (Either a b) (Either c d)
-> p (Either b a) (Either d c)
diswap =
let swap = either Right Left
in dimap swap swap
-- | Map on left or right of @Either@. Only one of @left@ or @right@ needs to be
-- provided.
class Profunctor p => Choice p where
left ::
p a b
-> p (Either a c) (Either b c)
left =
diswap . right
right ::
p a b
-> p (Either c a) (Either c b)
right =
diswap . left
instance Choice (->) where
left f =
either (Left . f) Right
right f =
either Left (Right . f)
instance Choice Tagged where
left (Tagged x) =
Tagged (Left x)
right (Tagged x) =
Tagged (Right x)