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