content: {-# LANGUAGE TypeFamilies #-}
  {-# LANGUAGE FlexibleContexts #-}
  {-# LANGUAGE FlexibleInstances #-}
  {-# LANGUAGE UndecidableInstances #-}
  {-# LANGUAGE MultiParamTypeClasses #-}
  -----------------------------------------------------------------------------
  -- |
  -- Module      :  Silica.Internal.Review
  -- Copyright   :  (C) 2012-2016 Edward Kmett
  -- License     :  BSD-style (see the file LICENSE)
  -- Maintainer  :  Edward Kmett <ekmett@gmail.com>
  -- Stability   :  provisional
  -- Portability :  non-portable
  --
  ----------------------------------------------------------------------------
  module Silica.Internal.Review
    (
    -- * Internal Classes
      Reviewable
    -- * Reviews
    , retagged
    ) where
  
  import Data.Bifunctor
  import Data.Profunctor
  import Data.Void
  
  -- | This class is provided mostly for backwards compatibility with lens 3.8,
  -- but it can also shorten type signatures.
  class (Profunctor p, Bifunctor p) => Reviewable p
  instance (Profunctor p, Bifunctor p) => Reviewable p
  
  ------------------------------------------------------------------------------
  -- Review: Reviewed
  ------------------------------------------------------------------------------
  
  -- | This is a profunctor used internally to implement "Review"
  --
  -- It plays a role similar to that of 'Silica.Internal.Getter.Accessor'
  -- or 'Const' do for "Silica.Getter"
  retagged :: (Profunctor p, Bifunctor p) => p a b -> p s b
  retagged = first absurd . lmap absurd
  