{-# LANGUAGE Rank2Types #-}
module Vgrep.Widget.Type
  ( Widget (..)

  -- ** Re-exports from "Vgrep.Event"
  , Redraw (..)
  , Next (..)
  ) where

import Graphics.Vty.Image (Image)

import Vgrep.Event (Next (..), Redraw (..))
import Vgrep.Type

-- | A 'Widget' is a unit that is displayed on the screen. It is associated
-- with a mutable state @s@. It provides an event handler with default
-- keybindings and can generate a renderable 'Image'.
--
-- Widget modules should provide a 'Widget' instance and additionally a
-- collection of actions that can be invoked by external event handlers:
--
-- @
-- widgetAction :: 'VgrepT' s m 'Redraw'
-- @
data Widget s = Widget
    { initialize :: s
    -- ^ The initial state of the widget

    , draw       :: forall m. Monad m => VgrepT s m Image
    -- ^ Generate a renderable 'Image' from the widget state. The state can
    -- be modified (e. g. for resizing).
    }