{- HLINT ignore "Use camelCase" -}

-- |
-- Copyright: © 2022–2026 Jonathan Knowles
-- License: Apache-2.0
--
-- Provides alternative implementations of @fromMapWith@, which constructs a
-- map of 'NonNull' values from an ordinary map, applying a function to all
-- values.
--
-- These implementations are exported so that they can be benchmarked against
-- one another.
--
module Data.MonoidMap.Internal.NonNullMap.FromMapWith
    ( fromMapWith_mapMaybe
    , fromMapWith_map_filter
    , fromMapWith_map_filter_if_any_null
    )
    where

import Prelude

import Data.Map.Strict
    ( Map )
import Data.Monoid.Null
    ( MonoidNull )
import Data.MonoidMap.Internal.NonNull
    ( NonNull, nonNull )
import Data.MonoidMap.Internal.NonNullMap.FromMap
    ( fromMap_filter
    , fromMap_filter_if_any_null
    )
import Data.MonoidMap.Internal.NonNullMap.Unsafe
    ( NonNullMap (..) )

import qualified Data.Map.Strict as Map

fromMapWith_mapMaybe
    :: MonoidNull v2 => (v1 -> v2) -> Map k v1 -> NonNullMap k v2
fromMapWith_mapMaybe :: forall v2 v1 k.
MonoidNull v2 =>
(v1 -> v2) -> Map k v1 -> NonNullMap k v2
fromMapWith_mapMaybe v1 -> v2
f = Map k (NonNull v2) -> NonNullMap k v2
forall k v. Map k (NonNull v) -> NonNullMap k v
NonNullMap (Map k (NonNull v2) -> NonNullMap k v2)
-> (Map k v1 -> Map k (NonNull v2)) -> Map k v1 -> NonNullMap k v2
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (v1 -> Maybe (NonNull v2)) -> Map k v1 -> Map k (NonNull v2)
forall a b k. (a -> Maybe b) -> Map k a -> Map k b
Map.mapMaybe (v2 -> Maybe (NonNull v2)
forall v. MonoidNull v => v -> Maybe (NonNull v)
nonNull (v2 -> Maybe (NonNull v2))
-> (v1 -> v2) -> v1 -> Maybe (NonNull v2)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. v1 -> v2
f)
{-# INLINABLE fromMapWith_mapMaybe #-}

fromMapWith_map_filter
    :: MonoidNull v2 => (v1 -> v2) -> Map k v1 -> NonNullMap k v2
fromMapWith_map_filter :: forall v2 v1 k.
MonoidNull v2 =>
(v1 -> v2) -> Map k v1 -> NonNullMap k v2
fromMapWith_map_filter v1 -> v2
f = Map k v2 -> NonNullMap k v2
forall v k. MonoidNull v => Map k v -> NonNullMap k v
fromMap_filter (Map k v2 -> NonNullMap k v2)
-> (Map k v1 -> Map k v2) -> Map k v1 -> NonNullMap k v2
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (v1 -> v2) -> Map k v1 -> Map k v2
forall a b k. (a -> b) -> Map k a -> Map k b
Map.map v1 -> v2
f
{-# INLINABLE fromMapWith_map_filter #-}

fromMapWith_map_filter_if_any_null
    :: MonoidNull v2 => (v1 -> v2) -> Map k v1 -> NonNullMap k v2
fromMapWith_map_filter_if_any_null :: forall v2 v1 k.
MonoidNull v2 =>
(v1 -> v2) -> Map k v1 -> NonNullMap k v2
fromMapWith_map_filter_if_any_null v1 -> v2
f = Map k v2 -> NonNullMap k v2
forall v k. MonoidNull v => Map k v -> NonNullMap k v
fromMap_filter_if_any_null (Map k v2 -> NonNullMap k v2)
-> (Map k v1 -> Map k v2) -> Map k v1 -> NonNullMap k v2
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (v1 -> v2) -> Map k v1 -> Map k v2
forall a b k. (a -> b) -> Map k a -> Map k b
Map.map v1 -> v2
f
{-# INLINABLE fromMapWith_map_filter_if_any_null #-}