Stream merge: Difference between revisions

Content added Content deleted
(Rename Perl 6 -> Raku, alphabetize, minor clean-up)
Line 535: Line 535:
}
}
</lang>
</lang>

=={{header|C}}==
=={{header|C}}==
<lang C>/*
<lang C>/*
Line 580: Line 581:
}
}
</lang>
</lang>

=={{header|C sharp|C#}}==
{{trans|Java}}
<lang csharp>using System;
using System.Collections.Generic;
using System.Linq;

namespace StreamMerge {
class Program {
static void Merge2<T>(IEnumerable<T> i1, IEnumerable<T> i2, Action<T> output) where T : IComparable {
IEnumerator<T> e1 = i1.GetEnumerator();
IEnumerator<T> e2 = i2.GetEnumerator();

bool hasA = e1.MoveNext();
bool hasB = e2.MoveNext();
while (hasA || hasB) {
if (hasA) {
if (hasB) {
IComparable a = e1.Current;
IComparable b = e2.Current;
if (a.CompareTo(b) < 0) {
output.Invoke(e1.Current);
hasA = e1.MoveNext();
}
else {
output.Invoke(e2.Current);
hasB = e2.MoveNext();
}
}
else {
output.Invoke(e1.Current);
hasA = e1.MoveNext();
}
}
else if (hasB) {
output.Invoke(e2.Current);
hasB = e2.MoveNext();
}
}
}

static void MergeN<T>(Action<T> output, params IEnumerable<T>[] enumerables) where T : IComparable {
if (enumerables.Length == 0) {
return;
}
if (enumerables.Length == 1) {
IEnumerator<T> e = enumerables[0].GetEnumerator();
while (e.MoveNext()) {
output.Invoke(e.Current);
}
return;
}

int count = enumerables.Length;
IEnumerator<T>[] eArr = new IEnumerator<T>[count];
bool[] hasN = new bool[count];
for (int i = 0; i < count; i++) {
eArr[i] = enumerables[i].GetEnumerator();
hasN[i] = eArr[i].MoveNext();
}

while (hasN.Aggregate(false, (a, b) => a || b)) {
int index = -1;
T value = default(T);
for (int i = 0; i < count; i++) {
if (hasN[i]) {
if (index == -1) {
value = eArr[i].Current;
index = i;
}
else if (eArr[i].Current.CompareTo(value) < 0) {
value = eArr[i].Current;
index = i;
}
}
}

output.Invoke(value);
hasN[index] = eArr[index].MoveNext();
}
}

static void Main(string[] args) {
List<int> a = new List<int>() { 1, 4, 7, 10 };
List<int> b = new List<int>() { 2, 5, 8, 11 };
List<int> c = new List<int>() { 3, 6, 9, 12 };

Merge2(a, b, m => Console.Write("{0} ", m));
Console.WriteLine();
MergeN(m => Console.Write("{0} ", m), a, b, c);
Console.WriteLine();
}
}
}</lang>
{{out}}
<pre>1 2 4 5 7 8 10 11
1 2 3 4 5 6 7 8 9 10 11 12</pre>


=={{header|C++}}==
=={{header|C++}}==
Line 683: Line 781:
0 3 6
0 3 6
0 1 2 3 4 5 6 7 8</pre>
0 1 2 3 4 5 6 7 8</pre>

=={{header|C#|C sharp}}==
{{trans|Java}}
<lang csharp>using System;
using System.Collections.Generic;
using System.Linq;

namespace StreamMerge {
class Program {
static void Merge2<T>(IEnumerable<T> i1, IEnumerable<T> i2, Action<T> output) where T : IComparable {
IEnumerator<T> e1 = i1.GetEnumerator();
IEnumerator<T> e2 = i2.GetEnumerator();

bool hasA = e1.MoveNext();
bool hasB = e2.MoveNext();
while (hasA || hasB) {
if (hasA) {
if (hasB) {
IComparable a = e1.Current;
IComparable b = e2.Current;
if (a.CompareTo(b) < 0) {
output.Invoke(e1.Current);
hasA = e1.MoveNext();
}
else {
output.Invoke(e2.Current);
hasB = e2.MoveNext();
}
}
else {
output.Invoke(e1.Current);
hasA = e1.MoveNext();
}
}
else if (hasB) {
output.Invoke(e2.Current);
hasB = e2.MoveNext();
}
}
}

static void MergeN<T>(Action<T> output, params IEnumerable<T>[] enumerables) where T : IComparable {
if (enumerables.Length == 0) {
return;
}
if (enumerables.Length == 1) {
IEnumerator<T> e = enumerables[0].GetEnumerator();
while (e.MoveNext()) {
output.Invoke(e.Current);
}
return;
}

int count = enumerables.Length;
IEnumerator<T>[] eArr = new IEnumerator<T>[count];
bool[] hasN = new bool[count];
for (int i = 0; i < count; i++) {
eArr[i] = enumerables[i].GetEnumerator();
hasN[i] = eArr[i].MoveNext();
}

while (hasN.Aggregate(false, (a, b) => a || b)) {
int index = -1;
T value = default(T);
for (int i = 0; i < count; i++) {
if (hasN[i]) {
if (index == -1) {
value = eArr[i].Current;
index = i;
}
else if (eArr[i].Current.CompareTo(value) < 0) {
value = eArr[i].Current;
index = i;
}
}
}

output.Invoke(value);
hasN[index] = eArr[index].MoveNext();
}
}

static void Main(string[] args) {
List<int> a = new List<int>() { 1, 4, 7, 10 };
List<int> b = new List<int>() { 2, 5, 8, 11 };
List<int> c = new List<int>() { 3, 6, 9, 12 };

Merge2(a, b, m => Console.Write("{0} ", m));
Console.WriteLine();
MergeN(m => Console.Write("{0} ", m), a, b, c);
Console.WriteLine();
}
}
}</lang>
{{out}}
<pre>1 2 4 5 7 8 10 11
1 2 3 4 5 6 7 8 9 10 11 12</pre>


=={{header|D}}==
=={{header|D}}==
Line 1,607: Line 1,608:
Merge of 6 streams:
Merge of 6 streams:
Curabitur Donec In In Integer Suspendisse elementum hendrerit eleifend luctus mi nec enim eu nec nisi maximus nunc ex, ac odio nulla, pulvinar mauris finibus sed. Ut non ex sed sit amet suscipit rutrum non sem. Donec lobortis nulla et rutrum bibendum. Duis tortor ultricies feugiat non at eros. Donec et scelerisque est. In ultricies. Vestibulum euismod, tellus sit amet eleifend ultrices, urna nulla. Duis nec consectetur lacus, et ut finibus elit aliquet in. In auctor varius, tellus in commodo gravida, lorem neque finibus quam, sagittis elementum leo mauris sit amet justo. Sed vel neque ligula. Etiam a ipsum a leo eleifend velit nisi dignissim lectus, non vestibulum fringilla metus eget varius. Aenean fringilla pellentesque massa, non ullamcorper mi commodo non. Sed aliquam molestie congue. Nunc lobortis turpis at nunc lacinia, id laoreet ipsum bibendum. ex. Aliquam lobortis tristique hendrerit. Suspendisse vestibulum velit eget sapien bibendum, sit amet porta lorem fringilla. Morbi bibendum in turpis ac blandit. Mauris semper nibh nec dignissim dapibus. Proin sagittis lacus est. sit amet ac arcu. Suspendisse odio libero, ullamcorper eu sem vestibulum sem nisi sed mi. Nulla scelerisque ut purus sed ultricies. Donec pulvinar eleifend malesuada. In vitae purus quis tristique. Mauris sed erat pulvinar, venenatis lectus auctor, malesuada neque. Integer a hendrerit tortor. Suspendisse aliquet pellentesque lorem, nec tincidunt arcu aliquet non. Phasellus eu diam massa. Integer vitae vitae, gravida dignissim ipsum. Aenean tincidunt commodo feugiat. Nunc viverra vehicula lorem id gravida. Pellentesque at ligula lorem. Cras gravida accumsan lacus sit amet tincidunt. Curabitur quam nisi, viverra dolor a tincidunt porta. Ut malesuada quis mauris eget vestibulum. Fusce sit amet libero id augue mattis auctor et sit amet ligula. augue. Nulla condimentum consectetur ante, ut consequat lectus suscipit eget. faucibus enim a luctus. Vivamus tellus erat, congue quis quam in, lobortis varius mi. Nulla ante orci, porttitor id dui ac, iaculis consequat ligula. vel nulla vel, rhoncus facilisis massa. Aliquam erat viverra viverra viverra viverra volutpat volutpat.</pre>
Curabitur Donec In In Integer Suspendisse elementum hendrerit eleifend luctus mi nec enim eu nec nisi maximus nunc ex, ac odio nulla, pulvinar mauris finibus sed. Ut non ex sed sit amet suscipit rutrum non sem. Donec lobortis nulla et rutrum bibendum. Duis tortor ultricies feugiat non at eros. Donec et scelerisque est. In ultricies. Vestibulum euismod, tellus sit amet eleifend ultrices, urna nulla. Duis nec consectetur lacus, et ut finibus elit aliquet in. In auctor varius, tellus in commodo gravida, lorem neque finibus quam, sagittis elementum leo mauris sit amet justo. Sed vel neque ligula. Etiam a ipsum a leo eleifend velit nisi dignissim lectus, non vestibulum fringilla metus eget varius. Aenean fringilla pellentesque massa, non ullamcorper mi commodo non. Sed aliquam molestie congue. Nunc lobortis turpis at nunc lacinia, id laoreet ipsum bibendum. ex. Aliquam lobortis tristique hendrerit. Suspendisse vestibulum velit eget sapien bibendum, sit amet porta lorem fringilla. Morbi bibendum in turpis ac blandit. Mauris semper nibh nec dignissim dapibus. Proin sagittis lacus est. sit amet ac arcu. Suspendisse odio libero, ullamcorper eu sem vestibulum sem nisi sed mi. Nulla scelerisque ut purus sed ultricies. Donec pulvinar eleifend malesuada. In vitae purus quis tristique. Mauris sed erat pulvinar, venenatis lectus auctor, malesuada neque. Integer a hendrerit tortor. Suspendisse aliquet pellentesque lorem, nec tincidunt arcu aliquet non. Phasellus eu diam massa. Integer vitae vitae, gravida dignissim ipsum. Aenean tincidunt commodo feugiat. Nunc viverra vehicula lorem id gravida. Pellentesque at ligula lorem. Cras gravida accumsan lacus sit amet tincidunt. Curabitur quam nisi, viverra dolor a tincidunt porta. Ut malesuada quis mauris eget vestibulum. Fusce sit amet libero id augue mattis auctor et sit amet ligula. augue. Nulla condimentum consectetur ante, ut consequat lectus suscipit eget. faucibus enim a luctus. Vivamus tellus erat, congue quis quam in, lobortis varius mi. Nulla ante orci, porttitor id dui ac, iaculis consequat ligula. vel nulla vel, rhoncus facilisis massa. Aliquam erat viverra viverra viverra viverra volutpat volutpat.</pre>

=={{header|Perl 6}}==
{{works with|Rakudo|2018.02}}

<lang perl6>sub merge_streams ( @streams ) {
my @s = @streams.map({ hash( STREAM => $_, HEAD => .get ) })\
.grep({ .<HEAD>.defined });

return gather while @s {
my $h = @s.min: *.<HEAD>;
take $h<HEAD>;
$h<HEAD> := $h<STREAM>.get
orelse @s .= grep( { $_ !=== $h } );
}
}

say merge_streams([ @*ARGS».&open ]);</lang>


=={{header|Phix}}==
=={{header|Phix}}==
Line 1,950: Line 1,934:
rdr: arg z; @.z= @.; f= z'.TXT'; if lines(f)\==0 then @.z= linein(f); return</lang>
rdr: arg z; @.z= @.; f= z'.TXT'; if lines(f)\==0 then @.z= linein(f); return</lang>
{{out|output|text=&nbsp; is the same as the 1<sup>st</sup> REXX version when using identical input files, &nbsp; except the output file is named &nbsp; '''ALL.TXT'''}} <br><br>
{{out|output|text=&nbsp; is the same as the 1<sup>st</sup> REXX version when using identical input files, &nbsp; except the output file is named &nbsp; '''ALL.TXT'''}} <br><br>

=={{header|Raku}}==
(formerly Perl 6)
{{works with|Rakudo|2018.02}}

<lang perl6>sub merge_streams ( @streams ) {
my @s = @streams.map({ hash( STREAM => $_, HEAD => .get ) })\
.grep({ .<HEAD>.defined });

return gather while @s {
my $h = @s.min: *.<HEAD>;
take $h<HEAD>;
$h<HEAD> := $h<STREAM>.get
orelse @s .= grep( { $_ !=== $h } );
}
}

say merge_streams([ @*ARGS».&open ]);</lang>


=={{header|Ruby}}==
=={{header|Ruby}}==