import { bignumberDocs } from './construction/bignumber'
import { typeOfDocs } from './function/utils/typeOf'
import { isZeroDocs } from './function/utils/isZero'
import { isPrimeDocs } from './function/utils/isPrime'
import { isPositiveDocs } from './function/utils/isPositive'
import { isNumericDocs } from './function/utils/isNumeric'
import { hasNumericValueDocs } from './function/utils/hasNumericValue'
import { isNegativeDocs } from './function/utils/isNegative'
import { isIntegerDocs } from './function/utils/isInteger'
import { isNaNDocs } from './function/utils/isNaN'
import { formatDocs } from './function/utils/format'
import { cloneDocs } from './function/utils/clone'
import { toDocs } from './function/units/to'
import { tanhDocs } from './function/trigonometry/tanh'
import { tanDocs } from './function/trigonometry/tan'
import { sinhDocs } from './function/trigonometry/sinh'
import { sechDocs } from './function/trigonometry/sech'
import { secDocs } from './function/trigonometry/sec'
import { cschDocs } from './function/trigonometry/csch'
import { cscDocs } from './function/trigonometry/csc'
import { cothDocs } from './function/trigonometry/coth'
import { cotDocs } from './function/trigonometry/cot'
import { coshDocs } from './function/trigonometry/cosh'
import { cosDocs } from './function/trigonometry/cos'
import { atan2Docs } from './function/trigonometry/atan2'
import { atanhDocs } from './function/trigonometry/atanh'
import { atanDocs } from './function/trigonometry/atan'
import { asinhDocs } from './function/trigonometry/asinh'
import { asinDocs } from './function/trigonometry/asin'
import { asechDocs } from './function/trigonometry/asech'
import { asecDocs } from './function/trigonometry/asec'
import { acschDocs } from './function/trigonometry/acsch'
import { acscDocs } from './function/trigonometry/acsc'
import { acothDocs } from './function/trigonometry/acoth'
import { acotDocs } from './function/trigonometry/acot'
import { acoshDocs } from './function/trigonometry/acosh'
import { acosDocs } from './function/trigonometry/acos'
import { sumDocs } from './function/statistics/sum'
import { stdDocs } from './function/statistics/std'
import { quantileSeqDocs } from './function/statistics/quantileSeq'
import { prodDocs } from './function/statistics/prod'
import { modeDocs } from './function/statistics/mode'
import { minDocs } from './function/statistics/min'
import { medianDocs } from './function/statistics/median'
import { meanDocs } from './function/statistics/mean'
import { maxDocs } from './function/statistics/max'
import { madDocs } from './function/statistics/mad'
import { erfDocs } from './function/special/erf'
import { setUnionDocs } from './function/set/setUnion'
import { setSymDifferenceDocs } from './function/set/setSymDifference'
import { setSizeDocs } from './function/set/setSize'
import { setPowersetDocs } from './function/set/setPowerset'
import { setMultiplicityDocs } from './function/set/setMultiplicity'
import { setIsSubsetDocs } from './function/set/setIsSubset'
import { setIntersectDocs } from './function/set/setIntersect'
import { setDistinctDocs } from './function/set/setDistinct'
import { setDifferenceDocs } from './function/set/setDifference'
import { setCartesianDocs } from './function/set/setCartesian'
import { unequalDocs } from './function/relational/unequal'
import { smallerEqDocs } from './function/relational/smallerEq'
import { smallerDocs } from './function/relational/smaller'
import { largerEqDocs } from './function/relational/largerEq'
import { largerDocs } from './function/relational/larger'
import { equalTextDocs } from './function/relational/equalText'
import { equalDocs } from './function/relational/equal'
import { deepEqualDocs } from './function/relational/deepEqual'
import { compareTextDocs } from './function/relational/compareText'
import { compareNaturalDocs } from './function/relational/compareNatural'
import { compareDocs } from './function/relational/compare'
import { randomIntDocs } from './function/probability/randomInt'
import { randomDocs } from './function/probability/random'
import { pickRandomDocs } from './function/probability/pickRandom'
import { permutationsDocs } from './function/probability/permutations'
import { multinomialDocs } from './function/probability/multinomial'
import { kldivergenceDocs } from './function/probability/kldivergence'
import { gammaDocs } from './function/probability/gamma'
import { factorialDocs } from './function/probability/factorial'
import { combinationsDocs } from './function/probability/combinations'
import { combinationsWithRepDocs } from './function/probability/combinationsWithRep'
import { zerosDocs } from './function/matrix/zeros'
import { transposeDocs } from './function/matrix/transpose'
import { traceDocs } from './function/matrix/trace'
import { subsetDocs } from './function/matrix/subset'
import { squeezeDocs } from './function/matrix/squeeze'
import { sortDocs } from './function/matrix/sort'
import { sizeDocs } from './function/matrix/size'
import { reshapeDocs } from './function/matrix/reshape'
import { resizeDocs } from './function/matrix/resize'
import { rangeDocs } from './function/matrix/range'
import { partitionSelectDocs } from './function/matrix/partitionSelect'
import { onesDocs } from './function/matrix/ones'
import { mapDocs } from './function/matrix/map'
import { kronDocs } from './function/matrix/kron'
import { invDocs } from './function/matrix/inv'
import { forEachDocs } from './function/matrix/forEach'
import { flattenDocs } from './function/matrix/flatten'
import { filterDocs } from './function/matrix/filter'
import { identityDocs } from './function/matrix/identity'
import { getMatrixDataTypeDocs } from './function/matrix/getMatrixDataType'
import { dotDocs } from './function/matrix/dot'
import { diagDocs } from './function/matrix/diag'
import { detDocs } from './function/matrix/det'
import { ctransposeDocs } from './function/matrix/ctranspose'
import { crossDocs } from './function/matrix/cross'
import { concatDocs } from './function/matrix/concat'
import { xorDocs } from './function/logical/xor'
import { orDocs } from './function/logical/or'
import { notDocs } from './function/logical/not'
import { andDocs } from './function/logical/and'
import { intersectDocs } from './function/geometry/intersect'
import { distanceDocs } from './function/geometry/distance'
import { helpDocs } from './function/expression/help'
import { evaluateDocs } from './function/expression/evaluate'
import { imDocs } from './function/complex/im'
import { reDocs } from './function/complex/re'
import { conjDocs } from './function/complex/conj'
import { argDocs } from './function/complex/arg'
import { typedDocs } from './core/typed'
import { importDocs } from './core/import'
import { configDocs } from './core/config'
import { stirlingS2Docs } from './function/combinatorics/stirlingS2'
import { compositionDocs } from './function/combinatorics/composition'
import { catalanDocs } from './function/combinatorics/catalan'
import { bellNumbersDocs } from './function/combinatorics/bellNumbers'
import { rightLogShiftDocs } from './function/bitwise/rightLogShift'
import { rightArithShiftDocs } from './function/bitwise/rightArithShift'
import { leftShiftDocs } from './function/bitwise/leftShift'
import { bitXorDocs } from './function/bitwise/bitXor'
import { bitOrDocs } from './function/bitwise/bitOr'
import { bitNotDocs } from './function/bitwise/bitNot'
import { bitAndDocs } from './function/bitwise/bitAnd'
import { xgcdDocs } from './function/arithmetic/xgcd'
import { unaryPlusDocs } from './function/arithmetic/unaryPlus'
import { unaryMinusDocs } from './function/arithmetic/unaryMinus'
import { squareDocs } from './function/arithmetic/square'
import { sqrtmDocs } from './function/arithmetic/sqrtm'
import { sqrtDocs } from './function/arithmetic/sqrt'
import { signDocs } from './function/arithmetic/sign'
import { roundDocs } from './function/arithmetic/round'
import { powDocs } from './function/arithmetic/pow'
import { nthRootsDocs } from './function/arithmetic/nthRoots'
import { nthRootDocs } from './function/arithmetic/nthRoot'
import { normDocs } from './function/arithmetic/norm'
import { multiplyDocs } from './function/arithmetic/multiply'
import { modDocs } from './function/arithmetic/mod'
import { log10Docs } from './function/arithmetic/log10'
import { log1pDocs } from './function/arithmetic/log1p'
import { log2Docs } from './function/arithmetic/log2'
import { logDocs } from './function/arithmetic/log'
import { lcmDocs } from './function/arithmetic/lcm'
import { hypotDocs } from './function/arithmetic/hypot'
import { gcdDocs } from './function/arithmetic/gcd'
import { floorDocs } from './function/arithmetic/floor'
import { fixDocs } from './function/arithmetic/fix'
import { expm1Docs } from './function/arithmetic/expm1'
import { expmDocs } from './function/arithmetic/expm'
import { eigsDocs } from './function/matrix/eigs'
import { expDocs } from './function/arithmetic/exp'
import { dotMultiplyDocs } from './function/arithmetic/dotMultiply'
import { dotDivideDocs } from './function/arithmetic/dotDivide'
import { divideDocs } from './function/arithmetic/divide'
import { cubeDocs } from './function/arithmetic/cube'
import { ceilDocs } from './function/arithmetic/ceil'
import { cbrtDocs } from './function/arithmetic/cbrt'
import { addDocs } from './function/arithmetic/add'
import { absDocs } from './function/arithmetic/abs'
import { qrDocs } from './function/algebra/qr'
import { usolveDocs } from './function/algebra/usolve'
import { sluDocs } from './function/algebra/slu'
import { rationalizeDocs } from './function/algebra/rationalize'
import { simplifyDocs } from './function/algebra/simplify'
import { lupDocs } from './function/algebra/lup'
import { lsolveDocs } from './function/algebra/lsolve'
import { derivativeDocs } from './function/algebra/derivative'
import { versionDocs } from './constants/version'
import { trueDocs } from './constants/true'
import { tauDocs } from './constants/tau'
import { SQRT2Docs } from './constants/SQRT2'
import { SQRT12Docs } from './constants/SQRT1_2'
import { phiDocs } from './constants/phi'
import { piDocs } from './constants/pi'
import { nullDocs } from './constants/null'
import { NaNDocs } from './constants/NaN'
import { LOG10EDocs } from './constants/LOG10E'
import { LOG2EDocs } from './constants/LOG2E'
import { LN10Docs } from './constants/LN10'
import { LN2Docs } from './constants/LN2'
import { InfinityDocs } from './constants/Infinity'
import { iDocs } from './constants/i'
import { falseDocs } from './constants/false'
import { eDocs } from './constants/e'
import { unitDocs } from './construction/unit'
import { stringDocs } from './construction/string'
import { splitUnitDocs } from './construction/splitUnit'
import { sparseDocs } from './construction/sparse'
import { numberDocs } from './construction/number'
import { matrixDocs } from './construction/matrix'
import { indexDocs } from './construction'
import { fractionDocs } from './construction/fraction'
import { createUnitDocs } from './construction/createUnit'
import { complexDocs } from './construction/complex'
import { booleanDocs } from './construction/boolean'
import { dotPowDocs } from './function/arithmetic/dotPow'
import { lusolveDocs } from './function/algebra/lusolve'
import { subtractDocs } from './function/arithmetic/subtract'
import { varianceDocs } from './function/statistics/variance'
import { sinDocs } from './function/trigonometry/sin'
import { numericDocs } from './function/utils/numeric'
import { columnDocs } from './function/matrix/column'
import { rowDocs } from './function/matrix/row'

export const embeddedDocs = {

  // construction functions
  bignumber: bignumberDocs,
  boolean: booleanDocs,
  complex: complexDocs,
  createUnit: createUnitDocs,
  fraction: fractionDocs,
  index: indexDocs,
  matrix: matrixDocs,
  number: numberDocs,
  sparse: sparseDocs,
  splitUnit: splitUnitDocs,
  string: stringDocs,
  unit: unitDocs,

  // constants
  e: eDocs,
  E: eDocs,
  false: falseDocs,
  i: iDocs,
  Infinity: InfinityDocs,
  LN2: LN2Docs,
  LN10: LN10Docs,
  LOG2E: LOG2EDocs,
  LOG10E: LOG10EDocs,
  NaN: NaNDocs,
  null: nullDocs,
  pi: piDocs,
  PI: piDocs,
  phi: phiDocs,
  SQRT1_2: SQRT12Docs,
  SQRT2: SQRT2Docs,
  tau: tauDocs,
  true: trueDocs,
  version: versionDocs,

  // physical constants
  // TODO: more detailed docs for physical constants
  speedOfLight: { description: 'Speed of light in vacuum', examples: ['speedOfLight'] },
  gravitationConstant: { description: 'Newtonian constant of gravitation', examples: ['gravitationConstant'] },
  planckConstant: { description: 'Planck constant', examples: ['planckConstant'] },
  reducedPlanckConstant: { description: 'Reduced Planck constant', examples: ['reducedPlanckConstant'] },

  magneticConstant: { description: 'Magnetic constant (vacuum permeability)', examples: ['magneticConstant'] },
  electricConstant: { description: 'Electric constant (vacuum permeability)', examples: ['electricConstant'] },
  vacuumImpedance: { description: 'Characteristic impedance of vacuum', examples: ['vacuumImpedance'] },
  coulomb: { description: 'Coulomb\'s constant', examples: ['coulomb'] },
  elementaryCharge: { description: 'Elementary charge', examples: ['elementaryCharge'] },
  bohrMagneton: { description: 'Borh magneton', examples: ['bohrMagneton'] },
  conductanceQuantum: { description: 'Conductance quantum', examples: ['conductanceQuantum'] },
  inverseConductanceQuantum: { description: 'Inverse conductance quantum', examples: ['inverseConductanceQuantum'] },
  // josephson: {description: 'Josephson constant', examples: ['josephson']},
  magneticFluxQuantum: { description: 'Magnetic flux quantum', examples: ['magneticFluxQuantum'] },
  nuclearMagneton: { description: 'Nuclear magneton', examples: ['nuclearMagneton'] },
  klitzing: { description: 'Von Klitzing constant', examples: ['klitzing'] },

  bohrRadius: { description: 'Borh radius', examples: ['bohrRadius'] },
  classicalElectronRadius: { description: 'Classical electron radius', examples: ['classicalElectronRadius'] },
  electronMass: { description: 'Electron mass', examples: ['electronMass'] },
  fermiCoupling: { description: 'Fermi coupling constant', examples: ['fermiCoupling'] },
  fineStructure: { description: 'Fine-structure constant', examples: ['fineStructure'] },
  hartreeEnergy: { description: 'Hartree energy', examples: ['hartreeEnergy'] },
  protonMass: { description: 'Proton mass', examples: ['protonMass'] },
  deuteronMass: { description: 'Deuteron Mass', examples: ['deuteronMass'] },
  neutronMass: { description: 'Neutron mass', examples: ['neutronMass'] },
  quantumOfCirculation: { description: 'Quantum of circulation', examples: ['quantumOfCirculation'] },
  rydberg: { description: 'Rydberg constant', examples: ['rydberg'] },
  thomsonCrossSection: { description: 'Thomson cross section', examples: ['thomsonCrossSection'] },
  weakMixingAngle: { description: 'Weak mixing angle', examples: ['weakMixingAngle'] },
  efimovFactor: { description: 'Efimov factor', examples: ['efimovFactor'] },

  atomicMass: { description: 'Atomic mass constant', examples: ['atomicMass'] },
  avogadro: { description: 'Avogadro\'s number', examples: ['avogadro'] },
  boltzmann: { description: 'Boltzmann constant', examples: ['boltzmann'] },
  faraday: { description: 'Faraday constant', examples: ['faraday'] },
  firstRadiation: { description: 'First radiation constant', examples: ['firstRadiation'] },
  loschmidt: { description: 'Loschmidt constant at T=273.15 K and p=101.325 kPa', examples: ['loschmidt'] },
  gasConstant: { description: 'Gas constant', examples: ['gasConstant'] },
  molarPlanckConstant: { description: 'Molar Planck constant', examples: ['molarPlanckConstant'] },
  molarVolume: { description: 'Molar volume of an ideal gas at T=273.15 K and p=101.325 kPa', examples: ['molarVolume'] },
  sackurTetrode: { description: 'Sackur-Tetrode constant at T=1 K and p=101.325 kPa', examples: ['sackurTetrode'] },
  secondRadiation: { description: 'Second radiation constant', examples: ['secondRadiation'] },
  stefanBoltzmann: { description: 'Stefan-Boltzmann constant', examples: ['stefanBoltzmann'] },
  wienDisplacement: { description: 'Wien displacement law constant', examples: ['wienDisplacement'] },
  // spectralRadiance: {description: 'First radiation constant for spectral radiance', examples: ['spectralRadiance']},

  molarMass: { description: 'Molar mass constant', examples: ['molarMass'] },
  molarMassC12: { description: 'Molar mass constant of carbon-12', examples: ['molarMassC12'] },
  gravity: { description: 'Standard acceleration of gravity (standard acceleration of free-fall on Earth)', examples: ['gravity'] },

  planckLength: { description: 'Planck length', examples: ['planckLength'] },
  planckMass: { description: 'Planck mass', examples: ['planckMass'] },
  planckTime: { description: 'Planck time', examples: ['planckTime'] },
  planckCharge: { description: 'Planck charge', examples: ['planckCharge'] },
  planckTemperature: { description: 'Planck temperature', examples: ['planckTemperature'] },

  // functions - algebra
  derivative: derivativeDocs,
  lsolve: lsolveDocs,
  lup: lupDocs,
  lusolve: lusolveDocs,
  simplify: simplifyDocs,
  rationalize: rationalizeDocs,
  slu: sluDocs,
  usolve: usolveDocs,
  qr: qrDocs,

  // functions - arithmetic
  abs: absDocs,
  add: addDocs,
  cbrt: cbrtDocs,
  ceil: ceilDocs,
  cube: cubeDocs,
  divide: divideDocs,
  dotDivide: dotDivideDocs,
  dotMultiply: dotMultiplyDocs,
  dotPow: dotPowDocs,
  exp: expDocs,
  expm: expmDocs,
  expm1: expm1Docs,
  fix: fixDocs,
  floor: floorDocs,
  gcd: gcdDocs,
  hypot: hypotDocs,
  lcm: lcmDocs,
  log: logDocs,
  log2: log2Docs,
  log1p: log1pDocs,
  log10: log10Docs,
  mod: modDocs,
  multiply: multiplyDocs,
  norm: normDocs,
  nthRoot: nthRootDocs,
  nthRoots: nthRootsDocs,
  pow: powDocs,
  round: roundDocs,
  sign: signDocs,
  sqrt: sqrtDocs,
  sqrtm: sqrtmDocs,
  square: squareDocs,
  subtract: subtractDocs,
  unaryMinus: unaryMinusDocs,
  unaryPlus: unaryPlusDocs,
  xgcd: xgcdDocs,

  // functions - bitwise
  bitAnd: bitAndDocs,
  bitNot: bitNotDocs,
  bitOr: bitOrDocs,
  bitXor: bitXorDocs,
  leftShift: leftShiftDocs,
  rightArithShift: rightArithShiftDocs,
  rightLogShift: rightLogShiftDocs,

  // functions - combinatorics
  bellNumbers: bellNumbersDocs,
  catalan: catalanDocs,
  composition: compositionDocs,
  stirlingS2: stirlingS2Docs,

  // functions - core
  config: configDocs,
  import: importDocs,
  typed: typedDocs,

  // functions - complex
  arg: argDocs,
  conj: conjDocs,
  re: reDocs,
  im: imDocs,

  // functions - expression
  evaluate: evaluateDocs,
  eval: evaluateDocs, // TODO: deprecated, cleanup in v7
  help: helpDocs,

  // functions - geometry
  distance: distanceDocs,
  intersect: intersectDocs,

  // functions - logical
  and: andDocs,
  not: notDocs,
  or: orDocs,
  xor: xorDocs,

  // functions - matrix
  concat: concatDocs,
  cross: crossDocs,
  column: columnDocs,
  ctranspose: ctransposeDocs,
  det: detDocs,
  diag: diagDocs,
  dot: dotDocs,
  getMatrixDataType: getMatrixDataTypeDocs,
  identity: identityDocs,
  filter: filterDocs,
  flatten: flattenDocs,
  forEach: forEachDocs,
  inv: invDocs,
  eigs: eigsDocs,
  kron: kronDocs,
  map: mapDocs,
  ones: onesDocs,
  partitionSelect: partitionSelectDocs,
  range: rangeDocs,
  resize: resizeDocs,
  reshape: reshapeDocs,
  row: rowDocs,
  size: sizeDocs,
  sort: sortDocs,
  squeeze: squeezeDocs,
  subset: subsetDocs,
  trace: traceDocs,
  transpose: transposeDocs,
  zeros: zerosDocs,

  // functions - probability
  combinations: combinationsDocs,
  combinationsWithRep: combinationsWithRepDocs,
  // distribution: distributionDocs,
  factorial: factorialDocs,
  gamma: gammaDocs,
  kldivergence: kldivergenceDocs,
  multinomial: multinomialDocs,
  permutations: permutationsDocs,
  pickRandom: pickRandomDocs,
  random: randomDocs,
  randomInt: randomIntDocs,

  // functions - relational
  compare: compareDocs,
  compareNatural: compareNaturalDocs,
  compareText: compareTextDocs,
  deepEqual: deepEqualDocs,
  equal: equalDocs,
  equalText: equalTextDocs,
  larger: largerDocs,
  largerEq: largerEqDocs,
  smaller: smallerDocs,
  smallerEq: smallerEqDocs,
  unequal: unequalDocs,

  // functions - set
  setCartesian: setCartesianDocs,
  setDifference: setDifferenceDocs,
  setDistinct: setDistinctDocs,
  setIntersect: setIntersectDocs,
  setIsSubset: setIsSubsetDocs,
  setMultiplicity: setMultiplicityDocs,
  setPowerset: setPowersetDocs,
  setSize: setSizeDocs,
  setSymDifference: setSymDifferenceDocs,
  setUnion: setUnionDocs,

  // functions - special
  erf: erfDocs,

  // functions - statistics
  mad: madDocs,
  max: maxDocs,
  mean: meanDocs,
  median: medianDocs,
  min: minDocs,
  mode: modeDocs,
  prod: prodDocs,
  quantileSeq: quantileSeqDocs,
  std: stdDocs,
  sum: sumDocs,
  variance: varianceDocs,
  var: varianceDocs, // TODO: deprecated, cleanup in v7

  // functions - trigonometry
  acos: acosDocs,
  acosh: acoshDocs,
  acot: acotDocs,
  acoth: acothDocs,
  acsc: acscDocs,
  acsch: acschDocs,
  asec: asecDocs,
  asech: asechDocs,
  asin: asinDocs,
  asinh: asinhDocs,
  atan: atanDocs,
  atanh: atanhDocs,
  atan2: atan2Docs,
  cos: cosDocs,
  cosh: coshDocs,
  cot: cotDocs,
  coth: cothDocs,
  csc: cscDocs,
  csch: cschDocs,
  sec: secDocs,
  sech: sechDocs,
  sin: sinDocs,
  sinh: sinhDocs,
  tan: tanDocs,
  tanh: tanhDocs,

  // functions - units
  to: toDocs,

  // functions - utils
  clone: cloneDocs,
  format: formatDocs,
  isNaN: isNaNDocs,
  isInteger: isIntegerDocs,
  isNegative: isNegativeDocs,
  isNumeric: isNumericDocs,
  hasNumericValue: hasNumericValueDocs,
  isPositive: isPositiveDocs,
  isPrime: isPrimeDocs,
  isZero: isZeroDocs,
  // print: printDocs // TODO: add documentation for print as soon as the parser supports objects.
  typeOf: typeOfDocs,
  typeof: typeOfDocs, // TODO: deprecated, cleanup in v7
  numeric: numericDocs
}
