///|
pub(all) enum Event {
  Key(KeyEvent)
  Resize(ResizeEvent)
  Paste(String)
  Mouse(MouseEvent)
  Focus(FocusEvent)
  Unknown(String)
} derive(Eq)

///|
pub(all) enum KeyCode {
  Character
  Enter
  Escape
  Backspace
  Tab
  Left
  Right
  Up
  Down
  Home
  End
  PageUp
  PageDown
  Insert
  Delete
  Function(Int)
  Unknown
} derive(Eq)

///|
pub(all) struct Modifiers {
  shift : Bool
  ctrl : Bool
  alt : Bool
  meta : Bool
} derive(Eq)

///|
pub fn Modifiers::new(
  shift? : Bool = false,
  ctrl? : Bool = false,
  alt? : Bool = false,
  meta? : Bool = false,
) -> Modifiers {
  Modifiers::{ shift, ctrl, alt, meta }
}

///|
pub(all) struct KeyEvent {
  code : KeyCode
  text : String?
  modifiers : Modifiers
} derive(Eq)

///|
pub(all) struct ResizeEvent {
  width : Int
  height : Int
} derive(Eq)

///|
pub(all) enum MouseButton {
  Left
  Right
  Middle
  Back
  Forward
  Unknown
} derive(Eq)

///|
pub(all) enum MouseAction {
  Move
  Down
  Up
  Drag
  Scroll
  Unknown
} derive(Eq)

///|
pub(all) struct MouseEvent {
  button : MouseButton
  action : MouseAction
  x : Int
  y : Int
  modifiers : Modifiers
} derive(Eq)

///|
pub(all) enum FocusState {
  Gained
  Lost
} derive(Eq)

///|
pub(all) struct FocusEvent {
  state : FocusState
} derive(Eq)

///|
pub(all) struct Size {
  width : Int
  height : Int
} derive(Eq)

///|
pub(all) enum TerminalError {
  NativeError(Int)
} derive(Eq)