This commit is contained in:
Dmitry Zuikov 2023-01-21 09:31:37 +03:00
parent 6b1db9529d
commit d3dcdbb186
1 changed files with 68 additions and 44 deletions

View File

@ -5,17 +5,18 @@
module Main where module Main where
import HBS2.Prelude.Plated import HBS2.Prelude.Plated
import HBS2.Actors
import HBS2.Hash import HBS2.Hash
import HBS2.Storage import HBS2.Net.Messaging
import HBS2.Net.Messaging.Fake
import HBS2.Net.Proto import HBS2.Net.Proto
import HBS2.Net.Proto.BlockChunks import HBS2.Net.Proto.BlockChunks
import HBS2.Net.Proto.BlockInfo import HBS2.Net.Proto.BlockInfo
import HBS2.Net.Messaging import HBS2.Storage
import HBS2.Net.Messaging.Fake import HBS2.Defaults
import Control.Monad.Reader import Control.Monad.Reader
import Data.Foldable import Data.Foldable
import Control.Monad
import Codec.Serialise hiding (encode,decode) import Codec.Serialise hiding (encode,decode)
import Data.ByteString.Lazy (ByteString) import Data.ByteString.Lazy (ByteString)
import Data.Default import Data.Default
@ -24,7 +25,8 @@ import Data.Map qualified as Map
import Data.Word import Data.Word
import GHC.TypeLits import GHC.TypeLits
import Lens.Micro.Platform import Lens.Micro.Platform
import Prettyprinter
import Prettyprinter hiding (pipe)
data Fake data Fake
@ -124,14 +126,57 @@ makeResponse h = AnyProtocol { myProtoId = natVal (Proxy @(ProtocolId p))
, handle = h , handle = h
} }
class IsResponse e m where data PeerEnv e =
responseTo :: m (Peer e) PeerEnv
{ _envSelf :: Peer e
, _envFab :: Fabriq e
}
newtype PeerM e m a = PeerM { fromPeerM :: ReaderT (PeerEnv e) m a }
deriving newtype ( Functor
, Applicative
, Monad
, MonadReader (PeerEnv e)
, MonadIO
)
type ResponseM e = ReaderT (Peer e) newtype ResponseM e m a = ResponseM { fromResponse :: ReaderT (ResponseEnv e) m a }
deriving newtype ( Functor
, Applicative
, Monad
, MonadReader (ResponseEnv e)
, MonadIO
, MonadTrans
)
runResponseM :: forall e m . Monad m => Peer e -> ResponseM e m () -> m () newtype ResponseEnv e =
runResponseM peer f = runReaderT f peer ResponseEnv
{ _answTo :: Peer e
}
makeLenses 'PeerEnv
makeLenses 'ResponseEnv
runResponseM :: forall e m . (Monad m)
=> Peer e
-> ResponseM e m ()
-> m ()
runResponseM peer f = runReaderT (fromResponse f) (ResponseEnv peer)
instance Monad m => HasOwnPeer e (PeerM e m) where
ownPeer = asks (view envSelf)
instance Monad m => HasFabriq e (PeerM e m) where
getFabriq = asks (view envFab)
runPeerM :: Peer e -> Fabriq e -> PeerM e m a -> m a
runPeerM p bus f = do
let env = PeerEnv p bus
runReaderT (fromPeerM f) env
runProto :: forall e m . ( MonadIO m runProto :: forall e m . ( MonadIO m
@ -147,6 +192,8 @@ runProto hh = do
me <- ownPeer @e @m me <- ownPeer @e @m
pipe <- getFabriq pipe <- getFabriq
-- defer <- newPipeline @(ResponseM e m ()) @m defProtoPipelineSize
let resp = [ (pid, a) | a@AnyProtocol { myProtoId = pid } <- hh ] let resp = [ (pid, a) | a@AnyProtocol { myProtoId = pid } <- hh ]
let disp = Map.fromList resp let disp = Map.fromList resp
@ -171,47 +218,24 @@ runProto hh = do
}) -> maybe (pure ()) (runResponseM pip . h) (decoder msg) }) -> maybe (pure ()) (runResponseM pip . h) (decoder msg)
data PeerEnv e =
PeerEnv
{ _envSelf :: Peer e
, _envFab :: Fabriq e
}
makeLenses 'PeerEnv
newtype PeerM e m a = PeerM { fromPeerM :: ReaderT (PeerEnv e) m a }
deriving newtype ( Functor
, Applicative
, Monad
, MonadReader (PeerEnv e)
, MonadIO
)
instance Monad m => HasOwnPeer e (PeerM e m) where
ownPeer = asks (view envSelf)
instance Monad m => HasFabriq e (PeerM e m) where
getFabriq = asks (view envFab)
runPeerM :: Peer e -> Fabriq e -> PeerM e m a -> m a
runPeerM p bus f = do
let env = PeerEnv p bus
runReaderT (fromPeerM f) env
instance ( MonadIO m instance ( MonadIO m
, HasProtocol e p , HasProtocol e p
, HasFabriq e (PeerM e m) , HasFabriq e m
, HasOwnPeer e (PeerM e m) , HasOwnPeer e m
, Serialise (Encoded e) , Serialise (Encoded e)
) => Response e p (ResponseM e (PeerM e m)) where , MonadTrans (ResponseM e)
thatPeer _ = ask ) => Response e p (ResponseM e m) where
deferred = undefined thatPeer _ = asks (view answTo)
deferred _ action = do
-- d <- asks (view defer)
undefined
-- addJob d _
response msg = do response msg = do
let proto = protoId @e @p (Proxy @p) let proto = protoId @e @p (Proxy @p)
who <- ask who <- asks (view answTo)
self <- lift $ ownPeer @e self <- lift $ ownPeer @e
fab <- lift $ getFabriq @e fab <- lift $ getFabriq @e
let bs = serialise (AnyMessage @e proto (encode msg)) let bs = serialise (AnyMessage @e proto (encode msg))