Skip to content

Commit ef33eea

Browse files
committed
add Enum.zip_reduce
1 parent ffa76a5 commit ef33eea

File tree

5 files changed

+215
-0
lines changed

5 files changed

+215
-0
lines changed
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
\tikzset{
2+
every list/.append style={
3+
element size=1cm,
4+
},
5+
}
6+
7+
\tikzset{
8+
reducer fun/.style={
9+
fun,
10+
function arity=2
11+
},
12+
}
13+
14+
\matrix [list=e, wrapper] {,
15+
\node (e1) [placeholder=4]; &
16+
\node (e2) [placeholder=3.5]; &
17+
\node [elements between=1]; &
18+
\node (en) [placeholder=4]; \\
19+
};
20+
21+
\matrix at (e1) [list=a] {
22+
\node [index=1]; &
23+
\node [index=2]; &
24+
\node [elements between=.5]; &
25+
\node [index=n]; &
26+
\node [elements after=.5]; \\
27+
};
28+
29+
\matrix at (e2) [list=b] {
30+
\node [index=1]; &
31+
\node [index=2]; &
32+
\node [elements between=.5]; &
33+
\node [index=n]; \\
34+
};
35+
36+
\matrix at (en) [list=k] {
37+
\node [index=1]; &
38+
\node [index=2]; &
39+
\node [elements between=.5]; &
40+
\node [index=n]; &
41+
\node [elements after=.5]; \\
42+
};
43+
44+
\matrix [list=e1, below=1 of e1] {
45+
\node {$a_1$}; &
46+
\node {$b_1$}; &
47+
\node [elements between]; &
48+
\node {$k_1$}; \\
49+
};
50+
51+
\matrix [list=e2, below=1 of e2] {
52+
\node {$a_2$}; &
53+
\node {$b_2$}; &
54+
\node [elements between]; &
55+
\node {$k_2$}; \\
56+
};
57+
58+
\matrix [list=en, below=1 of en] {
59+
\node {$a_n$}; &
60+
\node {$b_n$}; &
61+
\node [elements between]; &
62+
\node {$k_n$}; \\
63+
};
64+
65+
\node at ($ (list e.south)!.5!(list e2.north) $) {$\Downarrow$};
66+
67+
\foreach \i in {1,2,n}{
68+
\node (fun \i) [reducer fun, below=1 of list e\i, anchor=in 1];
69+
\draw [brace] (list e\i.south east) -- (list e\i.south west);
70+
\draw [->] (last brace) -- (fun \i.in);
71+
}
72+
73+
\matrix [list=b, wrapper, below=1 of fun 1, matrix anchor=e1.north] {,
74+
\node (e1) [placeholder=4]; &
75+
\node (e2) [placeholder=3.5]; &
76+
\node [elements between=1]; &
77+
\node (en) [placeholder=4]; \\
78+
};
79+
80+
\node at (e1) {$acc_1$};
81+
\node at (e2) {$acc_2$};
82+
\node at (en) {$acc_n$};
83+
84+
\foreach \i in {1,2,n}{
85+
\draw [->] (fun \i.out) -- (e\i.north);
86+
}
87+
88+
\draw [<-, out=90, in=0] (fun 1.in 2) to +(-1.5, .5)
89+
node [left] {$\texttt{acc}$};
90+
91+
\draw [->, out=0, in=90] ($ (fun 1.out)!.5!(e1.north) $) to (fun 2.in 2);
92+
\draw [->, out=0, in=90, dotted] ($ (fun 2.out)!.5!(e2.north) $) to (fun n.in 2);
93+
94+
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
\tikzset{
2+
reducer fun/.style={
3+
fun,
4+
function arity=2
5+
},
6+
}
7+
8+
%\matrix [list=e, wrapper] {,
9+
%\node (e1) [placeholder=4]; &
10+
%\node (e2) [placeholder=3.5]; &
11+
%\node [elements between=1]; &
12+
%\node (en) [placeholder=4]; \\
13+
%};
14+
15+
%\matrix [list=a] {
16+
%\node [index=1]; &
17+
%\node [index=2]; &
18+
%\node [elements between]; &
19+
%\node [index=n]; \\
20+
%};
21+
22+
%\matrix [list=b, right=1 of list a] {
23+
%\node [index=1]; &
24+
%\node [index=2]; &
25+
%\node [elements between]; &
26+
%\node [index=n]; &
27+
%\node [elements after]; \\
28+
%};
29+
30+
\begin{scope}
31+
\tikzset{
32+
every list/.append style={
33+
element size=1cm,
34+
},
35+
}
36+
37+
\matrix [list=e1] {
38+
\node {$a_1$}; &
39+
\node {$b_1$}; \\
40+
};
41+
42+
\matrix [list=e2, right=.5 of list e1] {
43+
\node {$a_2$}; &
44+
\node {$b_2$}; \\
45+
};
46+
47+
\matrix [list=en, right=1 of list e2] {
48+
\node {$a_n$}; &
49+
\node {$b_n$}; \\
50+
};
51+
\end{scope}
52+
53+
\coordinate (x) at ($ (list e1.west)!.5!(list en.east) $);
54+
55+
\matrix [list=a, above left=2 and .5 of x] {
56+
\node [index=1]; &
57+
\node [index=2]; &
58+
\node [elements between]; &
59+
\node [index=n]; \\
60+
};
61+
62+
\matrix [list=b, above right=2 and .5 of x] {
63+
\node [index=1]; &
64+
\node [index=2]; &
65+
\node [elements between]; &
66+
\node [index=n]; &
67+
\node [elements after]; \\
68+
};
69+
70+
\node at ($ (x) + (0, 1) $) {$\Downarrow$};
71+
72+
\foreach \i in {1,2,n}{
73+
\node (fun \i) [reducer fun, below=1 of list e\i, anchor=in 1];
74+
\draw [brace] (list e\i.south east) -- (list e\i.south west);
75+
\draw [->] (last brace) -- (fun \i.in);
76+
}
77+
78+
\matrix [list=b, below=1 of $(fun 1)!.5!(fun n)$] {,
79+
\node [minimum width=1.5 * \listitemsize] (b1) {$acc_1$}; &
80+
\node [minimum width=1.5 * \listitemsize] (b2) {$acc_2$}; &
81+
\node [elements between]; &
82+
\node [minimum width=1.5 * \listitemsize] (bn) {$acc_n$}; \\
83+
};
84+
85+
\foreach \i in {1,2,n}{
86+
\draw [->] (fun \i.out) -- (b\i.north);
87+
}
88+
89+
\draw [<-, out=90, in=0] (fun 1.in 2) to +(-1.5, .5)
90+
node [left] {$\texttt{acc}$};
91+
92+
\draw [->] ($ (fun 1.out)!.5!(b1.north) $) .. controls +(1, .5) and +(0, 1.5) .. (fun 2.in 2);
93+
\draw [->, dotted] ($ (fun 2.out)!.5!(b2.north) $) .. controls +(1, 0) and +(0, 1.5) .. (fun n.in 2);
94+
95+
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
title: zip_reduce/3
3+
url: Enum/zip_reduce/3
4+
---
5+
6+
Reduces applying the function `fun` over all of the given `enumerable`s, halting as soon as any enumerable is empty.
7+
8+
{{< figure src="images/functions/Enum/zip_reduce-3.svg" >}}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
---
2+
title: zip_reduce/4
3+
url: Enum/zip_reduce/4
4+
---
5+
6+
Reduces applying the function `fun` over two `enumerable`s, halting as soon as any enumerable is empty.
7+
8+
{{< figure src="images/functions/Enum/zip_reduce-4.svg" >}}

data/signatures.yaml

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -424,6 +424,16 @@
424424
defmodule Enum do
425425
def zip(enumerable1, enumerable2)
426426
end
427+
- name: zip_reduce/3
428+
signature: |
429+
defmodule Enum do
430+
def zip_reduce(enumerables, acc, fun)
431+
end
432+
- name: zip_reduce/4
433+
signature: |
434+
defmodule Enum do
435+
def zip_reduce(left, right, acc, fun)
436+
end
427437
- name: zip_with/2
428438
signature: |
429439
defmodule Enum do

0 commit comments

Comments
 (0)