hbs2/hbs2-core/lib/HBS2/Net/PeerLocator.hs

33 lines
1.2 KiB
Haskell

{-# Language AllowAmbiguousTypes #-}
module HBS2.Net.PeerLocator where
import HBS2.Prelude
import HBS2.Net.Proto.Types
import System.Random.Shuffle (shuffleM)
class PeerLocator e l where
knownPeers :: forall m . (HasPeer e, MonadIO m) => l -> m [Peer e]
addPeers :: forall m . (HasPeer e, MonadIO m) => l -> [Peer e] -> m ()
delPeers :: forall m . (HasPeer e, MonadIO m) => l -> [Peer e] -> m ()
bestPeers :: forall m . (HasPeer e, MonadIO m) => l -> m [Peer e]
addExcluded :: forall m . (HasPeer e, MonadIO m) => l -> [Peer e] -> m ()
knownPeersForPEX :: forall m . (HasPeer e, MonadIO m) => l -> m [Peer e]
knownPeersForPEX = knownPeers
data AnyPeerLocator e = forall a . PeerLocator e a => AnyPeerLocator a
instance HasPeer e => PeerLocator e (AnyPeerLocator e) where
knownPeers (AnyPeerLocator l) = knownPeers l
knownPeersForPEX (AnyPeerLocator l) = knownPeersForPEX l
addPeers (AnyPeerLocator l) = addPeers l
delPeers (AnyPeerLocator l) = delPeers l
addExcluded (AnyPeerLocator l) = addExcluded l
-- FIXME: a better algorithm of choice
bestPeers (AnyPeerLocator l) = knownPeers l >>= liftIO . shuffleM
class Monad m => HasPeerLocator e m where
getPeerLocator :: m (AnyPeerLocator e)