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

    -- * Construction
    , fromMap
    , fromMapWith

    -- * Deconstruction
    , toMap
    )
    where

import Prelude hiding
    ( null )

import Data.Map.Strict
    ( Map )
import Data.Monoid.Null
    ( MonoidNull (null) )
import Data.MonoidMap.Internal.NonNull
    ( NonNull )
import Data.MonoidMap.Internal.NonNullMap.FromMap
    ( fromMap_filter_if_any_null )
import Data.MonoidMap.Internal.NonNullMap.FromMapWith
    ( fromMapWith_mapMaybe )
import Data.MonoidMap.Internal.NonNullMap.Unsafe
    ( NonNullMap (..), toMap )

--------------------------------------------------------------------------------
-- Construction
--------------------------------------------------------------------------------

-- | Constructs a 'NonNullMap' from an ordinary 'Map', removing all
--   'null' values.
--
-- This function selects which of the implementations in
-- "Data.MonoidMap.Internal.NonNullMap.FromMap" is used by the public @fromMap@
-- function of the @monoidmap@ package.
--
fromMap :: MonoidNull v => Map k v -> NonNullMap k v
fromMap :: forall v k. MonoidNull v => Map k v -> NonNullMap k v
fromMap = Map k v -> NonNullMap k v
forall v k. MonoidNull v => Map k v -> NonNullMap k v
fromMap_filter_if_any_null
{-# INLINE fromMap #-}

-- | Constructs a 'NonNullMap' from an ordinary 'Map', applying the given
--   function to all values, and removing all 'null' values.
--
-- This function selects which of the implementations in
-- "Data.MonoidMap.Internal.NonNullMap.FromMapWith" is used by the public
-- @fromMapWith@ function of the @monoidmap@ package.
--
fromMapWith :: MonoidNull v2 => (v1 -> v2) -> Map k v1 -> NonNullMap k v2
fromMapWith :: forall v2 v1 k.
MonoidNull v2 =>
(v1 -> v2) -> Map k v1 -> NonNullMap k v2
fromMapWith = (v1 -> v2) -> Map k v1 -> NonNullMap k v2
forall v2 v1 k.
MonoidNull v2 =>
(v1 -> v2) -> Map k v1 -> NonNullMap k v2
fromMapWith_mapMaybe
{-# INLINE fromMapWith #-}