packages feed

nri-redis-0.1.0.0: src/NonEmptyDict.hs

-- | A simple NonEmpty dict wrapper to protect us from writing invalid empty Dicts
-- to Redis Hashes.
module NonEmptyDict
  ( NonEmptyDict,
    fromDict,
    toDict,
    toNonEmptyList,
    init,
    keys,
  )
where

import Data.List.NonEmpty (NonEmpty ((:|)))
import Dict

data NonEmptyDict k v
  = NonEmptyDict (k, v) (Dict.Dict k v)
  deriving (Show)

-- | tries to create a 'NonEmptyDict' from a 'Dict'
fromDict :: Ord k => Dict.Dict k v -> Maybe (NonEmptyDict k v)
fromDict dict =
  case Dict.toList dict of
    [] -> Nothing
    (k, v) : _ -> Just <| init k v dict

-- | creates a 'Dict' from a 'NonEmptyDict'
toDict :: Ord k => NonEmptyDict k v -> Dict k v
toDict (NonEmptyDict (k, v) dict) =
  Dict.insert k v dict

-- | creates a 'Dict' from a 'NonEmptyDict'
toNonEmptyList :: NonEmptyDict k v -> NonEmpty (k, v)
toNonEmptyList (NonEmptyDict kv dict) =
  kv :| Dict.toList dict

init :: Ord k => k -> v -> Dict.Dict k v -> NonEmptyDict k v
init key val dict =
  NonEmptyDict (key, val) (Dict.remove key dict)