-- |
-- Copyright: © 2022–2026 Jonathan Knowles
-- License: Apache-2.0
--
-- Provides the 'NonNull' type and related functions.
--
-- This module is intended to be imported qualified:
--
-- @
-- import Data.MonoidMap.Internal.NonNull (NonNull)
-- import Data.MonoidMap.Internal.NonNull qualified as NonNull
-- @
--
module Data.MonoidMap.Internal.NonNull
    (
    -- * Type
      NonNull

    -- * Construction
    , nonNull

    -- * Deconstruction
    , unwrap

    -- * Function application
    , apply
    , apply2
    )
    where

import Prelude hiding
    ( null )

import Data.Monoid.Null
    ( MonoidNull (null) )
import Data.MonoidMap.Internal.NonNull.Unsafe
    ( NonNull, nonNull, unwrap )

-- | Applies a function on ordinary values to a 'NonNull' value.
--
apply :: (v -> a) -> (NonNull v -> a)
apply :: forall v a. (v -> a) -> NonNull v -> a
apply v -> a
f = v -> a
f (v -> a) -> (NonNull v -> v) -> NonNull v -> a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NonNull v -> v
forall v. NonNull v -> v
unwrap
{-# INLINE apply #-}

-- | Applies a binary function on ordinary values to two 'NonNull' values.
--
apply2 :: (v1 -> v2 -> a) -> (NonNull v1 -> NonNull v2 -> a)
apply2 :: forall v1 v2 a. (v1 -> v2 -> a) -> NonNull v1 -> NonNull v2 -> a
apply2 v1 -> v2 -> a
f NonNull v1
v1 NonNull v2
v2 = v1 -> v2 -> a
f (NonNull v1 -> v1
forall v. NonNull v -> v
unwrap NonNull v1
v1) (NonNull v2 -> v2
forall v. NonNull v -> v
unwrap NonNull v2
v2)
{-# INLINE apply2 #-}