module Ribosome.Test.Input where

import Control.Concurrent.Lifted (fork, killThread)
import Control.Exception.Lifted (bracket)

import Ribosome.Api.Input (syntheticInput)
import Ribosome.Control.Monad.Ribo (NvimE)

withInput ::
  NvimE e m =>
  MonadIO m =>
  MonadBaseControl IO m =>
  Maybe Double ->
  [Text] ->
  m a ->
  m a
withInput :: Maybe Double -> [Text] -> m a -> m a
withInput Maybe Double
interval [Text]
chars m a
thunk =
  m ThreadId -> (ThreadId -> m ()) -> (ThreadId -> m a) -> m a
forall (m :: * -> *) a b c.
MonadBaseControl IO m =>
m a -> (a -> m b) -> (a -> m c) -> m c
bracket (m () -> m ThreadId
forall (m :: * -> *). MonadBaseControl IO m => m () -> m ThreadId
fork m ()
input) ThreadId -> m ()
forall (m :: * -> *). MonadBase IO m => ThreadId -> m ()
killThread (m a -> ThreadId -> m a
forall a b. a -> b -> a
const m a
thunk)
  where
    input :: m ()
input =
      Maybe Double -> [Text] -> m ()
forall (m :: * -> *) e.
(MonadIO m, NvimE e m) =>
Maybe Double -> [Text] -> m ()
syntheticInput Maybe Double
interval [Text]
chars