{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE UndecidableInstances #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Data.Can.Microlens
(
_Non
, _One
, _Eno
, _Two
, oneing
, enoing
, twoed
, twoing
) where
import Lens.Micro
import Data.Can
oneing :: Traversal (Can a c) (Can b c) a b
oneing f = \case
Non -> pure Non
One a -> One <$> f a
Eno c -> pure (Eno c)
Two a c -> flip Two c <$> f a
enoing :: Traversal (Can a b) (Can a c) b c
enoing f = \case
Non -> pure Non
One a -> pure (One a)
Eno b -> Eno <$> f b
Two a b -> Two a <$> f b
twoed :: Traversal' (Can a b) (a,b)
twoed f = \case
Non -> pure Non
One a -> pure (One a)
Eno b -> pure (Eno b)
Two a b -> uncurry Two <$> f (a,b)
twoing :: Traversal (Can a a) (Can b b) a b
twoing f = \case
Non -> pure Non
One a -> One <$> f a
Eno a -> Eno <$> f a
Two a b -> Two <$> f a <*> f b
_Non :: Traversal' (Can a b) ()
_Non f = \case
Non -> Non <$ f ()
One a -> pure (One a)
Eno b -> pure (Eno b)
Two a b -> pure (Two a b)
_One :: Traversal' (Can a b) a
_One f = \case
Non -> pure Non
One a -> One <$> f a
Eno b -> pure (Eno b)
Two a b -> pure (Two a b)
_Eno :: Traversal' (Can a b) b
_Eno f = \case
Non -> pure Non
One a -> pure (One a)
Eno b -> Eno <$> f b
Two a b -> pure (Two a b)
_Two :: Traversal' (Can a b) (a,b)
_Two f = \case
Non -> pure Non
One a -> pure (One a)
Eno b -> pure (Eno b)
Two a b -> uncurry Two <$> f (a,b)