import {
  scaleLinear,
  ScaleLinear,
  scaleLog,
  scaleTime,
  scaleUtc,
  scaleBand,
  scaleSqrt,
  ScaleBand,
  ScaleLogarithmic,
  ScalePower,
  ScaleTime,
  scaleOrdinal,
  scaleDiverging,
  scaleQuantile,
  scaleQuantize,
  scaleThreshold,
  scalePow,
  ScaleOrdinal,
  ScaleDiverging,
  ScaleSequential,
  ScaleQuantile,
  ScaleQuantize,
  ScaleThreshold,
  scaleSymlog,
  ScaleSymLog,
  scaleSequentialLog,
  scaleSequentialSymlog,
  scaleSequential,
  scaleSequentialSqrt,
} from 'd3-scale'

export type XYScale =
  | typeof scaleLinear
  | typeof scaleLog
  | typeof scaleSymlog
  | typeof scaleSqrt
  | typeof scalePow
  | typeof scaleTime
  | typeof scaleUtc
  | typeof scaleBand

export type XYScaleTypes = ScaleLinear<any, any> &
  ScaleLogarithmic<any, any> &
  ScaleSymLog<any, any> &
  ScalePower<any, any> &
  ScaleTime<any, any> &
  ScaleBand<any>

export type VisualEncoding =
  // categorical
  | typeof scaleOrdinal
  | typeof scaleQuantile
  | typeof scaleQuantize
  | typeof scaleThreshold
  // continuous
  | typeof scaleSequential
  | typeof scaleSequentialSqrt
  | typeof scaleDiverging
  | typeof scaleSequentialLog
  | typeof scaleSequentialSymlog

export type VisualEncodingTypes =
  // categorical
  ScaleOrdinal<any, any> &
    ScaleLinear<any, any> &
    ScaleDiverging<any> &
    ScaleSequential<any> &
    ScaleQuantile<any> &
    ScaleQuantize<any> &
    ScaleThreshold<any, any> &
    // continuous
    ScaleLinear<any, any> &
    ScalePower<any, any>
