| import {linearish} from "./linear.js"; |
| import {copy, transformer} from "./continuous.js"; |
| import {initRange} from "./init.js"; |
|
|
| function transformSymlog(c) { |
| return function(x) { |
| return Math.sign(x) * Math.log1p(Math.abs(x / c)); |
| }; |
| } |
|
|
| function transformSymexp(c) { |
| return function(x) { |
| return Math.sign(x) * Math.expm1(Math.abs(x)) * c; |
| }; |
| } |
|
|
| export function symlogish(transform) { |
| var c = 1, scale = transform(transformSymlog(c), transformSymexp(c)); |
|
|
| scale.constant = function(_) { |
| return arguments.length ? transform(transformSymlog(c = +_), transformSymexp(c)) : c; |
| }; |
|
|
| return linearish(scale); |
| } |
|
|
| export default function symlog() { |
| var scale = symlogish(transformer()); |
|
|
| scale.copy = function() { |
| return copy(scale, symlog()).constant(scale.constant()); |
| }; |
|
|
| return initRange.apply(scale, arguments); |
| } |
|
|