Skip to content

Commit 37d22a0

Browse files
committed
feat(package): initial commit
1 parent e34408a commit 37d22a0

File tree

5 files changed

+230
-7
lines changed

5 files changed

+230
-7
lines changed

.eslintrc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
"ecmaVersion": 5,
66
"env": {
77
"es6": false,
8-
"shared-node-browser": true
8+
"shared-node-browser": true,
9+
"commonjs": true
910
}
1011
}

README.md

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,54 @@
77

88
computes floor and ceiling for any modulus, not just 1
99

10+
```
11+
node
12+
> require('mod-floor-ceiling').modFloor(3.8, 1.7)
13+
3.4
14+
> require('mod-floor-ceiling').modFloor(3.4, 1.7)
15+
3.4
16+
> require('mod-floor-ceiling').modCeiling(-17.8, 2.5)
17+
-17.5
18+
> require('mod-floor-ceiling').modLower(15, 5)
19+
10
20+
> require('mod-floor-ceiling').modLower(16, 5)
21+
15
22+
> require('mod-floor-ceiling').modHigher(15, 5)
23+
20
24+
> require('mod-floor-ceiling').modHigher(14, 5)
25+
15
26+
27+
```
28+
29+
## Usage
30+
31+
```
32+
npm install mod-floor-ceiling
33+
```
34+
35+
### `modFloor(value: number, modulus: number, anchor?: number = 0): number`
36+
37+
Returns the greatest (closest to positive infinity) multiple of `modulus` that is `<= value`.
38+
39+
### `modCeiling(value: number, modulus: number, anchor?: number = 0): number`
40+
41+
Returns the least (closest to negative infinity) multiple of `modulus` that is `>= value`.
42+
43+
### `modLower(value: number, modulus: number, anchor?: number = 0): number`
44+
45+
Returns the greatest (closest to positive infinity) multiple of `modulus` that is `< value`.
46+
47+
### `modHigher(value: number, modulus: number, anchor?: number = 0): number`
48+
49+
Returns the greatest (closest to positive infinity) multiple of `modulus` that is `> value`.
50+
51+
### What is `anchor`?
52+
53+
**Anchor controls the offset of multiples of modulus.**
54+
55+
For example, with a modulus of 3 and the default anchor of 0, possible return values include -6, -3, 0, 3, 6, etc.
56+
57+
But with anchor of 1, possible return values include -5, -2, 1, 4, 7, etc.
58+
59+
It's simple; `modFloor(value, modulus, anchor)` just computes `anchor + modFloor(value - anchor, modulus)`.
60+

lib/index.js

Lines changed: 59 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,59 @@
1-
/* eslint-disable no-console, no-undef */
2-
console.log('Hello world!')
1+
/**
2+
* @param {number} value - the number to get the floor of
3+
* @param {number} modulus - the modulus of division
4+
* @param {number} [anchor=0] - controls the offset of multiples of modulus. For example, with a modulus of 3
5+
* and an anchor of 1, possible return values include -2, 1, 4, 7, etc.
6+
* @return the greatest (closest to positive infinity) multiple of modulus that is <= value.
7+
*/
8+
function modFloor(value, modulus, anchor) {
9+
if (anchor) return anchor + modFloor(value - anchor, modulus)
10+
if (value < 0.0) return -modCeiling(-value, modulus)
11+
modulus = Math.abs(modulus)
12+
return value - value % modulus
13+
}
14+
15+
/**
16+
* @param {number} value - the number to get the ceiling of
17+
* @param {number} modulus - the modulus of division
18+
* @param {number} [anchor=0] - controls the offset of multiples of modulus. For example, with a modulus of 3
19+
* and an anchor of 1, possible return values include -2, 1, 4, 7, etc.
20+
* @return the least (closest to negative infinity) multiple of modulus that is >= value.
21+
*/
22+
function modCeiling(value, modulus, anchor) {
23+
if (anchor) return anchor + modCeiling(value - anchor, modulus)
24+
if (value < 0.0) return -modFloor(-value, modulus)
25+
modulus = Math.abs(modulus)
26+
var rem = value % modulus
27+
if (rem !== 0.0) value += modulus - rem
28+
return value
29+
}
30+
31+
/**
32+
* @param {number} value - any number
33+
* @param {number} modulus - the modulus of division
34+
* @param {number} [anchor=0] - controls the offset of multiples of modulus. For example, with a modulus of 3
35+
* and an anchor of 1, possible return values include -2, 1, 4, 7, etc.
36+
* @return the greatest (closest to positive infinity) multiple of modulus that is < value.
37+
*/
38+
function modLower(value, modulus, anchor) {
39+
var result = modFloor(value, modulus, anchor)
40+
return result < value ? result : result - modulus
41+
}
42+
43+
/**
44+
* @param {number} value - any number
45+
* @param {number} modulus - the modulus of division
46+
* @param {number} [anchor=0] - controls the offset of multiples of modulus. For example, with a modulus of 3
47+
* and an anchor of 1, possible return values include -2, 1, 4, 7, etc.
48+
* @return the least (closest to negative infinity) multiple of modulus that is > value.
49+
*/
50+
function modHigher(value, modulus, anchor) {
51+
var result = modCeiling(value, modulus, anchor)
52+
return result > value ? result : result + modulus
53+
}
54+
55+
exports.modFloor = modFloor
56+
exports.modCeiling = modCeiling
57+
exports.modLower = modLower
58+
exports.modHigher = modHigher
59+

lib/index.js.flow

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
11
// @flow
22

3-
declare module.exports: {};
3+
declare export function modFloor(value: number, modulus: number, anchor?: number): number;
4+
declare export function modCeiling(value: number, modulus: number, anchor?: number): number;
5+
declare export function modLower(value: number, modulus: number, anchor?: number): number;
6+
declare export function modHigher(value: number, modulus: number, anchor?: number): number;
7+

test/index.js

Lines changed: 113 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,118 @@
1-
require('../lib')
1+
// @flow
22

3-
describe('test setup', function () {
4-
it('works', function () {
3+
var describe = require('mocha').describe
4+
var it = require('mocha').it
5+
var expect = require('chai').expect
56

7+
var modFloor = require('../lib').modFloor,
8+
modCeiling = require('../lib').modCeiling,
9+
modLower = require('../lib').modLower,
10+
modHigher = require('../lib').modHigher
11+
12+
describe('modFloor', function () {
13+
it('works for simple case', function () {
14+
expect(modFloor(5, 5)).to.equal(5)
15+
expect(modFloor(6, 5)).to.equal(5)
16+
expect(modFloor(11, 5)).to.equal(10)
17+
expect(modFloor(11, 2.5)).to.equal(10)
18+
expect(modFloor(11, 3.5)).to.equal(10.5)
19+
})
20+
it('works with anchor', function () {
21+
expect(modFloor(5, 5, -1)).to.equal(4)
22+
expect(modFloor(5, 5, 1)).to.equal(1)
23+
expect(modFloor(6, 5, 1)).to.equal(6)
24+
expect(modFloor(6, 5, -1)).to.equal(4)
25+
expect(modFloor(11, 5)).to.equal(10)
26+
expect(modFloor(11, 5, 2)).to.equal(7)
27+
expect(modFloor(11, 5, -2)).to.equal(8)
28+
})
29+
it('works with negative numbers', function () {
30+
expect(modFloor(-5, 5, -1)).to.equal(-6)
31+
expect(modFloor(-5, 5, 1)).to.equal(-9)
32+
expect(modFloor(-6, 5, 1)).to.equal(-9)
33+
expect(modFloor(-6, 5, -1)).to.equal(-6)
34+
expect(modFloor(-11, 5)).to.equal(-15)
35+
expect(modFloor(-11, 5, 2)).to.equal(-13)
36+
expect(modFloor(-11, 5, -2)).to.equal(-12)
37+
})
38+
})
39+
describe('modLower', function () {
40+
it('works for simple case', function () {
41+
expect(modLower(5, 5)).to.equal(0)
42+
expect(modLower(6, 5)).to.equal(5)
43+
expect(modLower(11, 5)).to.equal(10)
44+
expect(modLower(11, 2.5)).to.equal(10)
45+
expect(modLower(11, 3.5)).to.equal(10.5)
46+
})
47+
it('works with anchor', function () {
48+
expect(modLower(5, 5, -1)).to.equal(4)
49+
expect(modLower(5, 5, 1)).to.equal(1)
50+
expect(modLower(6, 5, 1)).to.equal(1)
51+
expect(modLower(6, 5, -1)).to.equal(4)
52+
expect(modLower(11, 5)).to.equal(10)
53+
expect(modLower(11, 5, 2)).to.equal(7)
54+
expect(modLower(11, 5, -2)).to.equal(8)
55+
})
56+
it('works with negative numbers', function () {
57+
expect(modLower(-5, 5, -1)).to.equal(-6)
58+
expect(modLower(-5, 5, 1)).to.equal(-9)
59+
expect(modLower(-6, 5, 1)).to.equal(-9)
60+
expect(modLower(-6, 5, -1)).to.equal(-11)
61+
expect(modLower(-11, 5)).to.equal(-15)
62+
expect(modLower(-11, 5, 2)).to.equal(-13)
63+
expect(modLower(-11, 5, -2)).to.equal(-12)
64+
})
65+
})
66+
describe('modCeiling', function () {
67+
it('works for simple case', function () {
68+
expect(modCeiling(5, 5)).to.equal(5)
69+
expect(modCeiling(6, 5)).to.equal(10)
70+
expect(modCeiling(11, 5)).to.equal(15)
71+
expect(modCeiling(11, 2.5)).to.equal(12.5)
72+
expect(modCeiling(11, 3.5)).to.equal(14)
73+
})
74+
it('works with anchor', function () {
75+
expect(modCeiling(5, 5, -1)).to.equal(9)
76+
expect(modCeiling(5, 5, 1)).to.equal(6)
77+
expect(modCeiling(6, 5, 1)).to.equal(6)
78+
expect(modCeiling(6, 5, -1)).to.equal(9)
79+
expect(modCeiling(11, 5, 2)).to.equal(12)
80+
expect(modCeiling(11, 5, -2)).to.equal(13)
81+
})
82+
it('works with negative numbers', function () {
83+
expect(modCeiling(-5, 5, -1)).to.equal(-1)
84+
expect(modCeiling(-5, 5, 1)).to.equal(-4)
85+
expect(modCeiling(-6, 5, 1)).to.equal(-4)
86+
expect(modCeiling(-6, 5, -1)).to.equal(-6)
87+
expect(modCeiling(-11, 5)).to.equal(-10)
88+
expect(modCeiling(-11, 5, 2)).to.equal(-8)
89+
expect(modCeiling(-11, 5, -2)).to.equal(-7)
90+
})
91+
})
92+
describe('modHigher', function () {
93+
it('works for simple case', function () {
94+
expect(modHigher(5, 5)).to.equal(10)
95+
expect(modHigher(6, 5)).to.equal(10)
96+
expect(modHigher(11, 5)).to.equal(15)
97+
expect(modHigher(11, 2.5)).to.equal(12.5)
98+
expect(modHigher(11, 3.5)).to.equal(14)
99+
})
100+
it('works with anchor', function () {
101+
expect(modHigher(5, 5, -1)).to.equal(9)
102+
expect(modHigher(5, 5, 1)).to.equal(6)
103+
expect(modHigher(6, 5, 1)).to.equal(11)
104+
expect(modHigher(6, 5, -1)).to.equal(9)
105+
expect(modHigher(11, 5, 2)).to.equal(12)
106+
expect(modHigher(11, 5, -2)).to.equal(13)
107+
})
108+
it('works with negative numbers', function () {
109+
expect(modHigher(-5, 5, -1)).to.equal(-1)
110+
expect(modHigher(-5, 5, 1)).to.equal(-4)
111+
expect(modHigher(-6, 5, 1)).to.equal(-4)
112+
expect(modHigher(-6, 5, -1)).to.equal(-1)
113+
expect(modHigher(-11, 5)).to.equal(-10)
114+
expect(modHigher(-11, 5, 2)).to.equal(-8)
115+
expect(modHigher(-11, 5, -2)).to.equal(-7)
6116
})
7117
})
8118

0 commit comments

Comments
 (0)