From a1caabbd8ae439d2b897e6cb4e10ef8e96deb474 Mon Sep 17 00:00:00 2001 From: Simon Buerger Date: Sat, 22 Jun 2019 21:13:59 +0200 Subject: [PATCH] Add Math.log() operator (#320) I had a need for Math.log in an Animation calculation. This code all seemed to work and I think I found all the touch points, but I'm not well versed on the native side of things so please let me know if anything needs to change. --- README.md | 9 +++++++++ .../com/swmansion/reanimated/nodes/OperatorNode.java | 8 ++++++++ ios/Nodes/REAOperatorNode.m | 1 + mock.js | 1 + react-native-reanimated.d.ts | 1 + src/core/AnimatedOperator.js | 1 + src/operators.js | 1 + 7 files changed, 22 insertions(+) diff --git a/README.md b/README.md index 06db641c53b..dc792817b7f 100644 --- a/README.md +++ b/README.md @@ -416,6 +416,15 @@ sqrt(nodeOrNumber) The square root of the given node. If the number is negative, an error is thrown. +--- +### `log` + +```js +log(nodeOrNumber) +``` + +The log of the given node. + --- ### `sin` diff --git a/android/src/main/java/com/swmansion/reanimated/nodes/OperatorNode.java b/android/src/main/java/com/swmansion/reanimated/nodes/OperatorNode.java index 45d8b947994..9d922c61af2 100644 --- a/android/src/main/java/com/swmansion/reanimated/nodes/OperatorNode.java +++ b/android/src/main/java/com/swmansion/reanimated/nodes/OperatorNode.java @@ -89,6 +89,12 @@ public double eval(Double x) { return Math.sqrt(x); } }; + private static final Operator LOG = new SingleOperator() { + @Override + public double eval(Double x) { + return Math.log(x); + } + }; private static final Operator SIN = new SingleOperator() { @Override public double eval(Double x) { @@ -235,6 +241,8 @@ public OperatorNode(int nodeID, ReadableMap config, NodesManager nodesManager) { mOperator = MODULO; } else if ("sqrt".equals(op)) { mOperator = SQRT; + } else if ("log".equals(op)) { + mOperator = LOG; } else if ("sin".equals(op)) { mOperator = SIN; } else if ("cos".equals(op)) { diff --git a/ios/Nodes/REAOperatorNode.m b/ios/Nodes/REAOperatorNode.m index 35f3581f915..571a5d9e27b 100644 --- a/ios/Nodes/REAOperatorNode.m +++ b/ios/Nodes/REAOperatorNode.m @@ -45,6 +45,7 @@ - (instancetype)initWithID:(REANodeID)nodeID config:(NSDictionary @"pow": REA_REDUCE(pow(a, b)), @"modulo": REA_REDUCE(fmodf(fmodf(a, b) + b, b)), @"sqrt": REA_SINGLE(sqrt(a)), + @"log": REA_SINGLE(log(a)), @"sin": REA_SINGLE(sin(a)), @"cos": REA_SINGLE(cos(a)), @"tan": REA_SINGLE(tan(a)), diff --git a/mock.js b/mock.js index 43799901aec..a8c434228fe 100644 --- a/mock.js +++ b/mock.js @@ -52,6 +52,7 @@ module.exports = { pow: NOOP, modulo: NOOP, sqrt: NOOP, + log: NOOP, sin: NOOP, cos: NOOP, tan: NOOP, diff --git a/react-native-reanimated.d.ts b/react-native-reanimated.d.ts index 7a30d62a384..a7a782826fc 100644 --- a/react-native-reanimated.d.ts +++ b/react-native-reanimated.d.ts @@ -195,6 +195,7 @@ declare module 'react-native-reanimated' { export const pow: MultiOperator; export const modulo: MultiOperator; export const sqrt: UnaryOperator; + export const log: UnaryOperator; export const sin: UnaryOperator; export const cos: UnaryOperator; export const tan: UnaryOperator; diff --git a/src/core/AnimatedOperator.js b/src/core/AnimatedOperator.js index 90c47f8c0d4..c3c5f7db6b4 100644 --- a/src/core/AnimatedOperator.js +++ b/src/core/AnimatedOperator.js @@ -29,6 +29,7 @@ const OPERATIONS = { pow: reduce((a, b) => Math.pow(a, b)), modulo: reduce((a, b) => ((a % b) + b) % b), sqrt: single(a => Math.sqrt(a)), + log: single(a => Math.log(a)), sin: single(a => Math.sin(a)), cos: single(a => Math.cos(a)), tan: single(a => Math.tan(a)), diff --git a/src/operators.js b/src/operators.js index 44ac71fbff9..8b209a5c18d 100644 --- a/src/operators.js +++ b/src/operators.js @@ -9,6 +9,7 @@ export const divide = operator('divide'); export const pow = operator('pow'); export const modulo = operator('modulo'); export const sqrt = operator('sqrt'); +export const log = operator('log'); export const sin = operator('sin'); export const cos = operator('cos'); export const exp = operator('exp');