{-# LANGUAGE TypeOperators          #-}

module Internal where
import           Control.Applicative
import           Data.Extensible.Internal (Member)
import           Data.Extensible.Plain    (K0 (..))
import           Data.Extensible.Sum
import           Data.Monoid

retract :: Member as a => K0 :| as -> Maybe a
retract = fmap getK0 . getFirst . getConst . picked (Const . First . Just)
{-# INLINE retract #-}

modify :: Member as a => (a -> a) -> K0 :| as -> K0 :| as
modify f = getK0 . picked (K0 . fmap f)
{-# INLINE modify #-}