///|
pub struct Style {
  borders : @papergrid.Borders
  horizontal_lines : @papergrid.HorizontalLines
  custom_horizontal_lines : Array[(Int, @papergrid.HorizontalLine)]
}

///|
pub enum Align {
  Left
  Right
  Center
}

///|
pub enum VAlign {
  Top
  Bottom
  Center
}

///|
pub enum Width {
  Wrap(Int, String)
  Truncate(Int, String)
}

///|
pub enum Height {
  Increase(Int)
  Limit(Int)
}

///|
pub enum Format {
  Surround(String, String, Bool)
  Value(String, Bool)
  Content((String) -> String, Bool)
  Positioned((String, Int, Int) -> String, Bool)
}

///|
pub struct Rows {
  start : Int
  end_ : Int
  skip_n : Int
  step_n : Int
  exclude : Rows?
  predicate : ((Entity) -> Bool)?
}

///|
pub struct Cols {
  start : Int
  end_ : Int
  skip_n : Int
  step_n : Int
  exclude : Cols?
  predicate : ((Entity) -> Bool)?
}

///|
pub struct Cell {
  row : Int
  col : Int
}

///|
pub struct ByColName {
  name : String
}

///|
pub enum Entity {
  Row(Int)
  Col(Int)
}

///|
pub enum SegmentKind {
  All
  Range(Int, Int, Int, Int)
  RowsOnly(Rows)
  ColsOnly(Cols)
  CellOnly(Cell)
  Cross(Rows, Cols)
  InverseRows(Rows)
  InverseCols(Cols)
  InverseCell(Cell)
  Union2(Segment, Segment)
  Diff2(Segment, Segment)
}

///|
pub struct Segment {
  kind : SegmentKind
  skip_n : Int
  step_n : Int
}

///|
pub enum Setting {
  Align(Align)
  VAlign(VAlign)
  Pad(Padding)
  W(Width)
  H(Height)
  Fmt(Format)
  SpanCol(Int)
  SpanRow(Int)
}

///|
pub struct Padding {
  left : Int
  right : Int
  top : Int
  bottom : Int
}

///|
pub struct HorizontalLine {
  line : @papergrid.HorizontalLine
}

///|
pub enum Span {}

///|
pub enum Panel {}