Exemplo n.º 1
0
        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());
        }
Exemplo n.º 2
0
        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");
        }
Exemplo n.º 3
0
        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));
        }
Exemplo n.º 4
0
        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));
        }
Exemplo n.º 5
0
        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 }));
        }
Exemplo n.º 6
0
        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 }));
        }
Exemplo n.º 7
0
        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));
        }
Exemplo n.º 8
0
        private static MyWriterUnit TellHelper(string s)
        {
            var listMonoid = new ListMonoid <string>(s);

            return(MyWriter.Tell(listMonoid));
        }
Exemplo n.º 9
0
        public void MEmpty()
        {
            var actual = ListMonoid.MEmpty <int>();

            Assert.That(actual.List, Is.Empty);
        }