sig
  type t = float * float * float * float
  val q : float -> float -> float -> float -> AGeom.Quaternion.t
  val real : AGeom.Quaternion.t -> float
  val imag : AGeom.Quaternion.t -> float * float * float
  val of_scalar : float -> AGeom.Quaternion.t
  val to_list : AGeom.Quaternion.t -> float list
  val of_list : float list -> AGeom.Quaternion.t
  val add : AGeom.Quaternion.t -> AGeom.Quaternion.t -> AGeom.Quaternion.t
  val sub : AGeom.Quaternion.t -> AGeom.Quaternion.t -> AGeom.Quaternion.t
  val div : AGeom.Quaternion.t -> AGeom.Quaternion.t -> AGeom.Quaternion.t
  val mul : AGeom.Quaternion.t -> AGeom.Quaternion.t -> AGeom.Quaternion.t
  val addr : AGeom.Quaternion.t -> float -> AGeom.Quaternion.t
  val radd : float -> AGeom.Quaternion.t -> AGeom.Quaternion.t
  val rsub : float -> AGeom.Quaternion.t -> AGeom.Quaternion.t
  val subr : AGeom.Quaternion.t -> float -> AGeom.Quaternion.t
  val rmul : float -> AGeom.Quaternion.t -> AGeom.Quaternion.t
  val mulr : AGeom.Quaternion.t -> float -> AGeom.Quaternion.t
  val norm : AGeom.Quaternion.t -> float
  val conj : AGeom.Quaternion.t -> AGeom.Quaternion.t
  val neg : AGeom.Quaternion.t -> AGeom.Quaternion.t
  val unit : AGeom.Quaternion.t -> AGeom.Quaternion.t
  val reciprocal : AGeom.Quaternion.t -> AGeom.Quaternion.t
  val length : AGeom.Quaternion.t -> float
  val to_string : AGeom.Quaternion.t -> string
  val of_string : string -> AGeom.Quaternion.t
  module Infix :
    sig
      val ( + ) :
        AGeom.Quaternion.t -> AGeom.Quaternion.t -> AGeom.Quaternion.t
      val ( - ) :
        AGeom.Quaternion.t -> AGeom.Quaternion.t -> AGeom.Quaternion.t
      val ( * ) :
        AGeom.Quaternion.t -> AGeom.Quaternion.t -> AGeom.Quaternion.t
      val ( / ) :
        AGeom.Quaternion.t -> AGeom.Quaternion.t -> AGeom.Quaternion.t
      val ( ~. ) : AGeom.Quaternion.t -> AGeom.Quaternion.t
      val ( |. ) : AGeom.Quaternion.t -> float
    end
end