packages feed

chiasma-0.10.1.0: lib/Chiasma/Data/WithPaneId.hs

module Chiasma.Data.WithPaneId where

import qualified Data.Text as Text

import Chiasma.Codec (TmuxCodec (decode, query), trim)
import Chiasma.Codec.Decode (primDecode)
import Chiasma.Data.DecodeError (DecodeError (DecodeError), DecodeFailure (TooFewFields))
import qualified Chiasma.Data.TmuxId as TmuxId
import Chiasma.Data.TmuxId (HasPaneId, PaneId)
import Chiasma.Data.TmuxQuery (TmuxQuery (TmuxQuery))

data WithPaneId a =
  WithPaneId {
    paneId :: PaneId,
    pane :: a
  }
  deriving stock (Eq, Show, Generic)

instance HasPaneId (WithPaneId a) where
  paneId = (.paneId)

safeBreakOn :: Text -> Text -> Maybe (Text, Text)
safeBreakOn n = \case
  "" -> Nothing
  t -> Just (second (Text.drop 1) (Text.breakOn n t))

instance TmuxCodec a => TmuxCodec (WithPaneId a) where
  decode payload =
    case safeBreakOn " " (trim payload) of
      Just (idField, rest) -> do
        pane <- decode rest
        paneId <- first (DecodeError [payload]) (primDecode idField)
        pure WithPaneId {..}
      Nothing ->
        Left (DecodeError [payload] TooFewFields)

  query =
    let TmuxQuery paneQuery = query @a
    in TmuxQuery ("#{pane_id} " <> paneQuery)