{-# LANGUAGE TemplateHaskell #-}
module Control.Effect.Map
(
Map'(..)
, Map
, clear
, lookup
, update
, delete'
, delete
, exists'
, exists
, insert'
, insert
, modify'
, modify
, tagMap'
, retagMap'
, untagMap'
) where
import Data.Maybe (isJust)
import Prelude hiding (lookup)
import Control.Effect.Machinery
class Monad m => Map' tag k v m | tag m -> k v where
clear' :: m ()
lookup' :: k -> m (Maybe v)
update' :: k -> Maybe v -> m ()
makeTaggedEffect ''Map'
delete' :: forall tag k v m. Map' tag k v m => k -> m ()
delete' :: k -> m ()
delete' k :: k
k = k -> Maybe v -> m ()
forall k (tag :: k) k v (m :: SomeMonad).
Map' tag k v m =>
k -> Maybe v -> m ()
update' @tag k
k Maybe v
forall a. Maybe a
Nothing
{-# INLINE delete' #-}
delete :: Map k v m => k -> m ()
delete :: k -> m ()
delete = forall k (tag :: k) k v (m :: SomeMonad).
Map' tag k v m =>
k -> m ()
forall k v (m :: SomeMonad). Map' G k v m => k -> m ()
delete' @G
{-# INLINE delete #-}
exists' :: forall tag k v m. Map' tag k v m => k -> m Bool
exists' :: k -> m Bool
exists' = (Maybe v -> Bool) -> m (Maybe v) -> m Bool
forall (f :: SomeMonad) a b. Functor f => (a -> b) -> f a -> f b
fmap Maybe v -> Bool
forall a. Maybe a -> Bool
isJust (m (Maybe v) -> m Bool) -> (k -> m (Maybe v)) -> k -> m Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall k (tag :: k) k v (m :: SomeMonad).
Map' tag k v m =>
k -> m (Maybe v)
forall k v (m :: SomeMonad). Map' tag k v m => k -> m (Maybe v)
lookup' @tag
{-# INLINE exists' #-}
exists :: Map k v m => k -> m Bool
exists :: k -> m Bool
exists = forall k (tag :: k) k v (m :: SomeMonad).
Map' tag k v m =>
k -> m Bool
forall k v (m :: SomeMonad). Map' G k v m => k -> m Bool
exists' @G
{-# INLINE exists #-}
insert' :: forall tag k v m. Map' tag k v m => k -> v -> m ()
insert' :: k -> v -> m ()
insert' k :: k
k = k -> Maybe v -> m ()
forall k (tag :: k) k v (m :: SomeMonad).
Map' tag k v m =>
k -> Maybe v -> m ()
update' @tag k
k (Maybe v -> m ()) -> (v -> Maybe v) -> v -> m ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. v -> Maybe v
forall a. a -> Maybe a
Just
{-# INLINE insert' #-}
insert :: Map k v m => k -> v -> m ()
insert :: k -> v -> m ()
insert = forall k (tag :: k) k v (m :: SomeMonad).
Map' tag k v m =>
k -> v -> m ()
forall k v (m :: SomeMonad). Map' G k v m => k -> v -> m ()
insert' @G
{-# INLINE insert #-}
modify' :: forall tag k v m. Map' tag k v m
=> v
-> (v -> v)
-> k
-> m ()
modify' :: v -> (v -> v) -> k -> m ()
modify' fallback :: v
fallback f :: v -> v
f k :: k
k = do
Maybe v
maybeVal <- k -> m (Maybe v)
forall k (tag :: k) k v (m :: SomeMonad).
Map' tag k v m =>
k -> m (Maybe v)
lookup' @tag k
k
case Maybe v
maybeVal of
Just v :: v
v -> k -> v -> m ()
forall k (tag :: k) k v (m :: SomeMonad).
Map' tag k v m =>
k -> v -> m ()
insert' @tag k
k (v -> v
f v
v)
Nothing -> k -> v -> m ()
forall k (tag :: k) k v (m :: SomeMonad).
Map' tag k v m =>
k -> v -> m ()
insert' @tag k
k (v -> v
f v
fallback)
{-# INLINE modify' #-}
modify :: Map k v m => v -> (v -> v) -> k -> m ()
modify :: v -> (v -> v) -> k -> m ()
modify = forall k (tag :: k) k v (m :: SomeMonad).
Map' tag k v m =>
v -> (v -> v) -> k -> m ()
forall k v (m :: SomeMonad).
Map' G k v m =>
v -> (v -> v) -> k -> m ()
modify' @G
{-# INLINE modify #-}