module Data.Vault (Vault, alterF) where

import Control.Monad.Trans.Key
import Data.Map (Map)
import qualified Data.Map as Map
import GHC.Exts (Any)
import Numeric.Natural
import Unsafe.Coerce

newtype Vault s = Vault { unVault :: Map Natural Any }

alterF :: (Functor f) => (Maybe a -> KeyringT s f (Maybe a)) -> Key s a -> Vault s -> KeyringT s f (Vault s)
alterF f k = fmap Vault . Map.alterF f' (unsafeCoerce k) . unVault
  where f' = unsafeCoerce f :: Maybe Any -> KeyringT s f (Maybe Any)