module Nbparts.Util.Map where

import Data.Map (Map)
import Data.Map qualified as Map
import Data.Text (Text)
import Data.Text qualified as Text

lookupByKeyPrefix :: Text -> Map Text v -> Maybe v
lookupByKeyPrefix :: forall v. Text -> Map Text v -> Maybe v
lookupByKeyPrefix Text
prefix Map Text v
m =
  -- First entry after performing `dropWhile` is the first entry whose key starts with the prefix.
  case ((Text, v) -> Bool) -> [(Text, v)] -> [(Text, v)]
forall a. (a -> Bool) -> [a] -> [a]
dropWhile (Bool -> Bool
not (Bool -> Bool) -> ((Text, v) -> Bool) -> (Text, v) -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> Text -> Bool
Text.isPrefixOf Text
prefix (Text -> Bool) -> ((Text, v) -> Text) -> (Text, v) -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Text, v) -> Text
forall a b. (a, b) -> a
fst) [(Text, v)]
entries of
    ((Text
_key, v
value) : [(Text, v)]
_) -> v -> Maybe v
forall a. a -> Maybe a
Just v
value
    [] -> Maybe v
forall a. Maybe a
Nothing
  where
    entries :: [(Text, v)]
entries = Map Text v -> [(Text, v)]
forall k a. Map k a -> [(k, a)]
Map.toList Map Text v
m