Array alignment addition Introduction
Consider two non-empty integer arrays, say A = [0 3 2 2 8 4] and B = [7 8 7 2].
To perform alignment addition on them, we do the following:

Repeat each array enough times to have total length \$\text{lcm(length(A), length(B))}\$. Here \$\text{lcm}\$ stands for lowest common multiple.
 A -&gt; [0 3 2 2  8 4][0 3  2 2 8 4]
 B -&gt; [7 8 7 2][7 8  7 2][7 8 7 2]


Perform element-wise addition on the repeated arrays, and cut the result at every position where there's a cut in either of them.
 A -&gt; [0  3 2 2   8  4][0 3  2  2  8 4]
 B -&gt; [7  8 7 2][ 7  8  7 2][7  8  7 2]
   -&gt; [7 11 9 4][15 12][7 5][9 10 15 6]


This array of arrays is your result.


The task
Your inputs are two non-empty arrays of integers, and your output shall be the result of their alignment addition, as defined above.
The inputs and output can be in any reasonable format.
You don't have to worry about integer overflow when performing the addition.
Rules and scoring
You can write a full program or a function.
The lowest byte count wins.
Test cases
[1] [4] -&gt; [[5]]
[1,2,-3,-4] [15] -&gt; [[16],[17],[12],[11]]
[0,-4] [2,1,0,-3] -&gt; [[2,-3],[0,-7]]
[0,3,2,2,8,4] [7,8,7,2] -&gt; [[7,11,9,4],[15,12],[7,5],[9,10,15,6]]
[18,17,16] [-1,-2,-3,-4] -&gt; [[17,15,13],[14],[16,14],[15,13],[15],[16,14,12]]
[18,17,16,15] [-1,-2,-3,-4] -&gt; [[17,15,13,11]]
[1,1,1,1,1] [6,5,6,5,6,5,6,2,1] -&gt; [[7,6,7,6,7],[6,7,3,2],[7],[6,7,6,7,6],[7,3,2],[7,6],[7,6,7,6,7],[3,2],[7,6,7],[6,7,6,7,3],[2],[7,6,7,6],[7,6,7,3,2]]
[1,1,1,1,1,1] [6,5,6,5,6,5,6,2,1] -&gt; [[7,6,7,6,7,6],[7,3,2],[7,6,7],[6,7,6,7,3,2]]
[1,1,1,1,1,1,1] [6,5,6,5,6,5,6,2,1] -&gt; [[7,6,7,6,7,6,7],[3,2],[7,6,7,6,7],[6,7,3,2],[7,6,7],[6,7,6,7,3,2],[7],[6,7,6,7,6,7,3],[2],[7,6,7,6,7,6],[7,3,2],[7,6,7,6],[7,6,7,3,2],[7,6],[7,6,7,6,7,3,2]]
JavaScript (ES6), 101 99 bytes

Takes input as 2 arrays. Returns a string.

f=(a,b,j=0,s='')=&gt;a.map((v,i)=&gt;(s+=i*j?' ':s&amp;&amp;'][',s+=b[j]+v,j=++j%b.length))|j?f(a,b,j,s):`[${s}]`


How it works

We iterate on the first array a with a pointer i while updating another pointer j into the second array b. The sums a[i] + b[j] are appended to the output string s. A separator is inserted each time i == 0 or j == 0. We repeat this process until j is back exactly at the beginning of b at the end of an iteration.

Note: When the | operator is applied, a.map(...) is coerced to either NaN (if a contains more than one element) or the current value of j (if a contains exactly one element). Therefore, a.map(...)|j == j in all cases and is safe to use here.

Test cases



f=(a,b,j=0,s='')=&gt;a.map((v,i)=&gt;(s+=i*j?' ':s&amp;&amp;'][',s+=b[j]+v,j=++j%b.length))|j?f(a,b,j,s):`[${s}]`

console.log(f([1], [4]));
console.log(f([1,2,-3,-4], [15]));
console.log(f([0,-4], [2,1,0,-3]));
console.log(f([0,3,2,2,8,4], [7,8,7,2]));
console.log(f([18,17,16], [-1,-2,-3,-4]));
console.log(f([18,17,16,15], [-1,-2,-3,-4]));
console.log(f([1,1,1,1,1], [6,5,6,5,6,5,6,2,1]));
console.log(f([1,1,1,1,1,1], [6,5,6,5,6,5,6,2,1]));
console.log(f([1,1,1,1,1,1,1], [6,5,6,5,6,5,6,2,1]));