toxcore-0.2.11: src/Network/Tox/Crypto/Keyed.hs
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE Safe #-}
{-# LANGUAGE UndecidableInstances #-}
-- | Monad class for caching of combined keys
module Network.Tox.Crypto.Keyed where
import Control.Applicative (Applicative, pure, (<*>))
import Control.Monad (Monad)
import Control.Monad.Random (RandT)
import Control.Monad.Reader (ReaderT)
import Control.Monad.RWS (RWST)
import Control.Monad.State (StateT)
import Control.Monad.Trans (lift)
import Control.Monad.Writer (WriterT)
import Data.Monoid (Monoid)
import qualified Network.Tox.Crypto.CombinedKey as CombinedKey
import Network.Tox.Crypto.Key (CombinedKey, PublicKey,
SecretKey)
class (Monad m, Applicative m) => Keyed m where
getCombinedKey :: SecretKey -> PublicKey -> m CombinedKey
instance Keyed m => Keyed (ReaderT r m) where
getCombinedKey = (lift .) . getCombinedKey
instance (Monoid w, Keyed m) => Keyed (WriterT w m) where
getCombinedKey = (lift .) . getCombinedKey
instance Keyed m => Keyed (StateT s m) where
getCombinedKey = (lift .) . getCombinedKey
instance (Monoid w, Keyed m) => Keyed (RWST r w s m) where
getCombinedKey = (lift .) . getCombinedKey
instance Keyed m => Keyed (RandT s m) where
getCombinedKey = (lift .) . getCombinedKey
-- | trivial instance: the trivial monad, with no caching of keys
newtype NullKeyed a = NullKeyed { runNullKeyed :: a }
instance Functor NullKeyed where
fmap f (NullKeyed x) = NullKeyed (f x)
instance Applicative NullKeyed where
pure = NullKeyed
(NullKeyed f) <*> (NullKeyed x) = NullKeyed (f x)
instance Monad NullKeyed where
return = NullKeyed
NullKeyed x >>= f = f x
instance Keyed NullKeyed where
getCombinedKey = (NullKeyed .) . CombinedKey.precompute