{-# OPTIONS_GHC -fno-warn-orphans #-}

{-# LANGUAGE CPP #-}

{- |
Copyright:  (c) 2018-2020 Kowainik
SPDX-License-Identifier: MPL-2.0
Maintainer: Kowainik <xrom.xkov@gmail.com>

This module contains 'LogAction' orphan instances of @contravariant@ classes.
-}

module Colog.Contra
       (
       ) where

#if !MIN_VERSION_base(4,12,0)
import Data.Functor.Contravariant (Contravariant (..))
#endif
import Data.Functor.Contravariant.Divisible (Decidable (..), Divisible (..))

import Colog.Core.Action (LogAction)

import qualified Colog.Core.Action as LA


#if !MIN_VERSION_base(4,12,0)
instance Contravariant (LogAction m) where
    contramap = LA.cmap
    {-# INLINE contramap #-}
    (>$) = (LA.>$)
    {-# INLINE (>$) #-}
#endif

instance (Applicative m) => Divisible (LogAction m) where
    divide :: (a -> (b, c)) -> LogAction m b -> LogAction m c -> LogAction m a
divide  = (a -> (b, c)) -> LogAction m b -> LogAction m c -> LogAction m a
forall (m :: * -> *) a b c.
Applicative m =>
(a -> (b, c)) -> LogAction m b -> LogAction m c -> LogAction m a
LA.divide
    {-# INLINE divide #-}
    conquer :: LogAction m a
conquer = LogAction m a
forall (m :: * -> *) a. Applicative m => LogAction m a
LA.conquer
    {-# INLINE conquer #-}

instance (Applicative m) => Decidable (LogAction m) where
    lose :: (a -> Void) -> LogAction m a
lose   = (a -> Void) -> LogAction m a
forall a (m :: * -> *). (a -> Void) -> LogAction m a
LA.lose
    {-# INLINE lose #-}
    choose :: (a -> Either b c)
-> LogAction m b -> LogAction m c -> LogAction m a
choose = (a -> Either b c)
-> LogAction m b -> LogAction m c -> LogAction m a
forall a b c (m :: * -> *).
(a -> Either b c)
-> LogAction m b -> LogAction m c -> LogAction m a
LA.choose
    {-# INLINE choose #-}