packages feed

polysemy-process-0.14.0.0: lib/Polysemy/Process/Effect/Pty.hs

{-# options_haddock prune #-}

-- | Description: Pty Effect, Internal
module Polysemy.Process.Effect.Pty where

import System.IO (Handle)

-- | Horizontal size of a pseudo terminal in characters.
newtype Rows =
  Rows { unRows :: Int }
  deriving stock (Eq, Show, Generic)
  deriving newtype (Num, Real, Enum, Integral, Ord)

-- | Vertical size of a pseudo terminal in characters.
newtype Cols =
  Cols { unCols :: Int }
  deriving stock (Eq, Show, Generic)
  deriving newtype (Num, Real, Enum, Integral, Ord)

-- | A pseudo terminal, to be scoped with 'withPty'.
data Pty :: Effect where
  -- | The file descriptor that can be connected to stdio of a process.
  Handle :: Pty m Handle
  -- | Set the size of the terminal.
  Resize :: Rows -> Cols -> Pty m ()
  -- | Get the size of the terminal.
  Size :: Pty m (Rows, Cols)

makeSem ''Pty

-- | Bracket an action with the creation and destruction of a pseudo terminal.
withPty ::
  Member (Scoped_ Pty) r =>
  InterpreterFor Pty r
withPty =
  scoped_