packages feed

ribosome-host-0.9.9.9: lib/Ribosome/Host/Socket.hs

module Ribosome.Host.Socket where

import Ribosome.Host.Data.BootError (BootError (BootError))
import Ribosome.Host.Data.NvimSocket (NvimSocket)
import Ribosome.Host.Data.Report (Report)
import Ribosome.Host.Data.RpcHandler (RpcHandler)
import Ribosome.Host.Effect.Handlers (Handlers)
import Ribosome.Host.Effect.Rpc (Rpc)
import Ribosome.Host.IOStack (BasicStack)
import Ribosome.Host.Interpreter.Handlers (interpretHandlers, interpretHandlersNull)
import Ribosome.Host.Interpreter.Host (testHost, withHost)
import Ribosome.Host.Interpreter.Process.Socket (interpretProcessCerealSocket)
import Ribosome.Host.Interpreter.UserError (interpretUserErrorInfo)
import Ribosome.Host.Run (RpcDeps, RpcStack, interpretRpcStack)

type HostSocketStack =
  RpcStack ++ RpcDeps

interpretRpcDeps ::
  Members [Reader NvimSocket, Error BootError, Log, Resource, Race, Async, Embed IO] r =>
  InterpretersFor RpcDeps r
interpretRpcDeps =
  interpretUserErrorInfo .
  interpretProcessCerealSocket def .
  resumeHoistError (BootError . show @Text) .
  raiseUnder

interpretHostSocket ::
  Members BasicStack r =>
  Member (Reader NvimSocket) r =>
  InterpretersFor HostSocketStack r
interpretHostSocket =
  interpretRpcDeps .
  interpretRpcStack

withHostSocket ::
  Members BasicStack r =>
  Member (Reader NvimSocket) r =>
  InterpreterFor (Handlers !! Report) (HostSocketStack ++ r) ->
  InterpretersFor HostSocketStack r
withHostSocket handlers =
  interpretHostSocket .
  handlers .
  withHost .
  insertAt @0

testHostSocket ::
  Members BasicStack r =>
  Member (Reader NvimSocket) r =>
  InterpreterFor (Handlers !! Report) (HostSocketStack ++ r) ->
  InterpretersFor (Rpc : HostSocketStack) r
testHostSocket handlers =
  interpretHostSocket .
  handlers .
  testHost .
  insertAt @1

runHostSocket ::
  Members BasicStack r =>
  Member (Reader NvimSocket) r =>
  [RpcHandler (HostSocketStack ++ r)] ->
  InterpretersFor (Rpc : HostSocketStack) r
runHostSocket handlers =
  testHostSocket (interpretHandlers handlers)

runHostSocket_ ::
  Members BasicStack r =>
  Member (Reader NvimSocket) r =>
  InterpretersFor (Rpc : HostSocketStack) r
runHostSocket_ =
  testHostSocket interpretHandlersNull