    {-# LANGUAGE CPP, NoImplicitPrelude #-}
    module Data.Function.Compat (
      module Base
    , (&)
    , applyWhen
    ) where
    import Data.Function as Base

    #if !(MIN_VERSION_base(4,18,0))
    import Prelude.Compat
    #endif

    #if !(MIN_VERSION_base(4,8,0))
    infixl 1 &

    -- | '&' is a reverse application operator.  This provides notational
    -- convenience.  Its precedence is one higher than that of the forward
    -- application operator '$', which allows '&' to be nested in '$'.
    --
    -- /Since: 4.8.0.0/
    (&) :: a -> (a -> b) -> b
    x & f = f x

    #endif

    #if !(MIN_VERSION_base(4,18,0))
    -- | 'applyWhen' applies a function to a value if a condition is true,
    -- otherwise, it returns the value unchanged.
    --
    -- It is equivalent to @'flip' ('Data.Bool.bool' 'id')@.
    --
    -- Algebraic properties:
    --
    -- * @applyWhen 'True' = 'id'@
    --
    -- * @applyWhen 'False' f = 'id'@
    --
    -- /Since: 4.18.0.0/
    applyWhen :: Bool -> (a -> a) -> a -> a
    applyWhen True  f x = f x
    applyWhen False _ x = x
    -- Proofs:
    --
    -- flip bool id = \q f -> bool id f q
    -- = \f q -> case q of
    --     True -> f = \x -> f x
    --     False -> id = \x -> x ∎
    --
    -- applyWhen True = \f x -> f x
    -- = \f -> \x -> f x = \f -> f = id ∎
    --
    -- applyWhen False f = \x -> x = id ∎
    #endif