sig
  type tag = ..
  type tag += TName of string
  type vertex = private
      MoveTo of Math.vector
    | LineTo of Math.vector
    | BezierTo of Math.vector * Math.vector * Math.vector
    | Arc of Math.vector * Math.vector * float * float * float
    | ClosePath
  type t = private
      Shape of Shape.vertex list
    | Group of Shape.t list
    | Paint of Shape.t * Paint.paint_update
    | Tag of Shape.t * Shape.tag
    | Background of Color.color
    | Empty
  val poly : ?close:[ `Close | `Open ] -> Math.vector list -> Shape.t
  val point : Math.vector -> Shape.t
  val line : Math.vector -> Math.vector -> Shape.t
  val rect :
    Math.vector -> ?align:[ `Center | `Corner ] -> Math.vector -> Shape.t
  val quad :
    Math.vector -> Math.vector -> Math.vector -> Math.vector -> Shape.t
  val triangle : Math.vector -> Math.vector -> Math.vector -> Shape.t
  val ellipse :
    Math.vector -> ?align:[ `Center | `Corner ] -> Math.vector -> Shape.t
  val circle :
    Math.vector -> ?align:[ `Center | `Corner ] -> float -> Shape.t
  val arc :
    Math.vector ->
    ?align:[ `Center | `Corner ] ->
    Math.vector ->
    ?stroke_mode:[ `Closed | `Open ] ->
    ?fill_mode:[ `Chord | `Pie ] -> ?phi:float -> float -> float -> Shape.t
  val bezier : Bezier.t -> Shape.t
  val group : Shape.t list -> Shape.t
  val shape : Shape.t -> Math.vector -> Shape.t
  val background : Color.color -> Shape.t
  val empty : Shape.t
  val fill : Color.color -> Shape.t -> Shape.t
  val no_fill : Shape.t -> Shape.t
  val stroke : Color.color -> Shape.t -> Shape.t
  val no_stroke : Shape.t -> Shape.t
  val stroke_weight : float -> Shape.t -> Shape.t
  val stroke_cap : [ `Project | `Round | `Square ] -> Shape.t -> Shape.t
  val stroke_join : [ `Bevel | `Miter | `Round ] -> Shape.t -> Shape.t
  val bleach : Shape.t -> Shape.t
  val name : string -> Shape.t -> Shape.t
  val find_name : string -> Shape.t -> Shape.t option
  val find_names : string -> Shape.t -> Shape.t list
  val tag : Shape.tag -> Shape.t -> Shape.t
  val find_tag :
    ?eq:(Shape.tag -> Shape.tag -> bool) ->
    Shape.tag -> Shape.t -> Shape.t option
  val find_tags :
    ?eq:(Shape.tag -> Shape.tag -> bool) ->
    Shape.tag -> Shape.t -> Shape.t list
  val translate : Math.vector -> Shape.t -> Shape.t
  val scale : Math.vector -> Shape.t -> Shape.t
  val rotate : float -> Shape.t -> Shape.t
end