private static Writer <ListMonoid <Entry>, Entry, List <Maybe <Packet> > > GroupSame( ListMonoid <Entry> initial, Func <ListMonoid <Entry>, ListMonoid <Entry>, Writer <ListMonoid <Entry>, Entry, ListMonoid <Entry> > > merge, List <Packet> packets, Func <Packet, Writer <ListMonoid <Entry>, Entry, Maybe <Packet> > > fn) { if (!packets.Any()) { return(from _ in WriterEntries.Tell(initial) select new List <Maybe <Packet> >()); } var x = packets.First(); var xs = packets.Skip(1).ToList(); return(from tuple in WriterEntries.Return(fn(x).RunWriter) let result = tuple.Item1 let output = tuple.Item2 let localxs = xs let localfn = fn let localinitial = initial from @new in merge(localinitial, output) from rest in GroupSame(@new, merge, localxs, localfn) select Enumerable.Repeat(result, 1).Concat(rest).ToList()); }
private static WriterEntriesEntries MergeEntries(ListMonoid <Entry> e1, ListMonoid <Entry> e2) { if (e1.List.Count == 0) { return(WriterEntries.Return(e2)); } if (e2.List.Count == 0) { return(WriterEntries.Return(e1)); } if (e1.List.Count == 1 && e2.List.Count == 1) { var n1 = e1.List[0].Count; var msg1 = e1.List[0].Msg; var n2 = e2.List[0].Count; var msg2 = e2.List[0].Msg; return((msg1 == msg2) ? WriterEntries.Return(new ListMonoid <Entry>(new Entry(n1 + n2, msg1))) : from _ in WriterEntries.Tell(e1) select e2); } throw new InvalidOperationException("MergeEntries: non-exhaustive patterns"); }
public void MAppendOfXAndMEmptyIsX() { // x <> mempty = x var x = new ListMonoid <int>(1, 2, 3); var actual = x.MAppend(ListMonoid.MEmpty <int>()); Assert.That(actual.List, Is.EqualTo(x.List)); }
public void MAppendOfMEmptyAndXIsX() { // mempty <> x = x var x = new ListMonoid <int>(1, 2, 3); var actual = ListMonoid.MEmpty <int>().MAppend(x); Assert.That(actual.List, Is.EqualTo(x.List)); }
public void MAppend() { var lm1 = new ListMonoid <int>(1, 2, 3); var lm2 = new ListMonoid <int>(4, 5, 6); var actual = lm1.MAppend(lm2); Assert.That(actual.List, Is.EqualTo(new[] { 1, 2, 3, 4, 5, 6 })); }
public void MConcat() { var lm1 = new ListMonoid <int>(1, 2, 3); var lm2 = new ListMonoid <int>(4, 5, 6); var lm3 = new ListMonoid <int>(7, 8, 9); var actual = ListMonoid.MConcat(lm1, lm2, lm3); Assert.That(actual.List, Is.EqualTo(new[] { 1, 2, 3, 4, 5, 6, 7, 8, 9 })); }
public void MAppendAssociativity() { // x <> (y <> z) = (x <> y) <> z var x = new ListMonoid <int>(1, 2, 3); var y = new ListMonoid <int>(4, 5, 6); var z = new ListMonoid <int>(7, 8, 9); var actual1 = x.MAppend(y.MAppend(z)); var actual2 = x.MAppend(y).MAppend(z); Assert.That(actual1.List, Is.EqualTo(actual2.List)); }
private static MyWriterUnit TellHelper(string s) { var listMonoid = new ListMonoid <string>(s); return(MyWriter.Tell(listMonoid)); }
public void MEmpty() { var actual = ListMonoid.MEmpty <int>(); Assert.That(actual.List, Is.Empty); }