signal/lib/math.js

import { val } from './core'

/**
 * > Mathematical functions and constants
 *
 * Note that a lot of the math functions have a precision that's implementation-dependent.
 *
 * @see Math
 * @module signal/arithmetic
 */

/**
 * Get absolute value of a signal
 * @name abs
 * @function
 * @memberof module:signal/arithmetic
 */
export const abs = (a) => () => Math.abs(val(a))

/**
 * Add signals
 * @name add
 * @function
 * @memberof module:signal/arithmetic
 */
export const add = (a, b) => () => val(a) + val(b)

/**
 * Subtract signals
 * @name sub
 * @function
 * @memberof module:signal/arithmetic
 */
export const sub = (a, b) => () => val(a) - val(b)

/**
 * Subtract signals
 * @name div
 * @function
 * @memberof module:signal/arithmetic
 */
export const div = (a, b) => val(a) / val(b)

/**
 * Subtract signals
 * @name mod
 * @function
 * @memberof module:signal/arithmetic
 */
export const mod = (a, b) => val(a) % val(b)

/**
 * Subtract signals
 * @name mul
 * @function
 * @memberof module:signal/arithmetic
 */
export const mul = (a, b) => val(a) * val(b)
/**
 * Subtract signals
 * @name pow
 * @function
 * @memberof module:signal/arithmetic
 */
export const pow = (a, b) => Math.pow(val(a), val(b))

/**
 * Returns the arcosine (in radians) of a number
 * @param {Signal|Number} number
 * @return {Signal}
 */
export const acos = (number) => () => Math.acos(val(number))

/**
 * Returns the arcsine (in radians) of a number
 * @param {Signal|Number} number
 * @return {Signal}
 */
export const asin = (number) => () => Math.asin(val(number))

/**
 * Returns the arctangent (in radians) of a number
 * @param {Signal|Number} number
 * @return {Signal}
 */
export const atan = (number) => () => Math.atan(val(number))

/**
 * Returns the cosine of the input (interpreted as radians)
 * @param {Signal|Number} radians
 * @return {Signal}
 */
export const cos = (radians) => () => Math.cos(val(radians))

/**
 * Returns the sine of the input (interpreted as radians)
 * @param {Signal|Number} radians
 * @return {Signal}
 */
export const sin = (radians) => () => Math.sin(val(radians))

/**
 * Returns the tangent of the input (interpreted as radians)
 * @param {Signal|Number} radians
 * @return {Signal}
 */
export const tan = (radians) => () => Math.tan(val(radians))

/**
 * Returns the smallest integer greater than or equal to a given number
 *
 * @param {Signal|Number} number
 * @return {Signal}
 * @see Math.ceil
 */
export const ceil = (num) => () => Math.ceil(val(num))

/**
 * Returns the largest integer less than or equal to a given number
 *
 * @param {Signal|Number} number
 * @return {Signal}
 * @see Math.floor
 */
export const floor = (num) => () => Math.floor(val(num))

/**
 * Rounds the signal to a number of decimals
 */
export function round (signal, dec = 0) {
  var f = Math.pow(10, dec)
  return () => Math.round(val(signal) * f) / f
}