#' Uniform "bar" charts
#'
#' I've been using `geom_segment` more to make "bar" charts, setting
#' `xend` to whatever `x` is and `yend` to `0`. The bar widths remain
#' constant without any tricks and you have granular control over the
#' segment width. I decided it was time to make a `geom`.
#'
#' @md
#' @section Aesthetics:
#' `geom_ubar`` understands the following aesthetics (required aesthetics are in bold):
#'
#' - **`x`**
#' - **`y`**
#' - `alpha`
#' - `colour`
#' - `group`
#' - `linetype`
#' - `size`
#'
#' @inheritParams ggplot2::layer
#' @param na.rm If `FALSE` (the default), removes missing values with
#'    a warning.  If `TRUE` silently removes missing values.
#' @param ... other arguments passed on to `layer`. These are
#'   often aesthetics, used to set an aesthetic to a fixed value, like
#'   `color = "red"` or `size = 3`. They may also be parameters
#'   to the paired geom/stat.
#' @inheritParams ggplot2::layer
#' @export
#' @examples
#' library(ggplot2)
#'
#' data(economics)
#' ggplot(economics, aes(date, uempmed)) +
#'   geom_ubar()
geom_ubar <- function(mapping = NULL, data = NULL, stat = "identity",
                      position = "identity", ...,
                      na.rm = FALSE, show.legend = NA, inherit.aes = TRUE) {

  layer(
    data = data,
    mapping = mapping,
    stat = "identity",
    geom = GeomUbar,
    position = "identity",
    show.legend = show.legend,
    inherit.aes = inherit.aes,
    params = list(
      na.rm = na.rm,
      ...
    )
  )
}

#' @rdname ggalt-ggproto
#' @format NULL
#' @usage NULL
#' @export
GeomUbar <- ggproto("GeomUbar", Geom,
  required_aes = c("x", "y"),
  non_missing_aes = c("size"),
  default_aes = aes(
    size = 0.25, colour = "black", alpha = NA
  ),

  setup_data = function(data, params) {
    transform(data, xend = x, yend = 0)
  },

  draw_group = function(data, panel_scales, coord) {

    ggplot2::GeomSegment$draw_panel(data, panel_scales, coord)

  }

)


