packages feed

ribosome-0.9.9.9: lib/Ribosome/Api/Input.hs

-- |Functions for simulating user input in tests.
module Ribosome.Api.Input where

import Conc (withAsync_)
import qualified Polysemy.Time as Time
import Time (MilliSeconds, NanoSeconds, convert)

import Ribosome.Host.Api.Effect (nvimInput, nvimReplaceTermcodes, nvimFeedkeys)
import Ribosome.Host.Effect.Rpc (Rpc)

-- |Send a list of character sequences as user input to Neovim with an optional wait interval.
--
-- Uses @nvim_input@.
syntheticInput ::
  Members [Rpc, Time t d] r =>
  Maybe NanoSeconds ->
  [Text] ->
  Sem r ()
syntheticInput interval =
  traverse_ \ c ->
    traverse_ Time.sleep interval *> nvimInput c

-- |Send a sequence of keys using @nvim_feedkeys@ after replacing terminal codes.
feedKey ::
  Member Rpc r =>
  Text ->
  Sem r ()
feedKey k = do
  key <- nvimReplaceTermcodes k True False True
  nvimFeedkeys key "mt" False

-- |Send a list of character sequences as user input to Neovim with an optional wait interval.
--
-- Uses @nvim_feedkeys@.
syntheticInputFk ::
  Members [Rpc, Time t d] r =>
  Maybe NanoSeconds ->
  [Text] ->
  Sem r ()
syntheticInputFk interval =
  traverse_ \ c ->
    traverse_ Time.sleep interval *> feedKey c

-- |Run an action after forking a thread that sends user input to Neovim. 
withInput ::
  Members [Rpc, Resource, Race, Async, Time t d] r =>
  Maybe MilliSeconds ->
  Maybe MilliSeconds ->
  [Text] ->
  Sem r a ->
  Sem r a
withInput delay interval chrs =
  withAsync_ (traverse_ Time.sleep delay *> syntheticInput (convert <$> interval) chrs)