Exemplo n.º 1
0
 public RoseTreeEnumerator(RoseTree <T> tree)
 {
     OriginalTree = tree;
     TreeQueue    = new Stack <Lazy <RoseTree <T> > >();
     TreeQueue.Push(new Lazy <RoseTree <T> >(() => tree));
     CurrentRoseTree = null;
 }
Exemplo n.º 2
0
        public IEnumerator <object[]> GetEnumerator()
        {
            yield return(new object[] {
                PhotoLeaf("1", 2018, 11, 9, 11, 47, 17),
                "D",
                Node("D", new [] { RoseTree.Node("2018-11", new [] { new RoseLeaf <string, FileInfo>(new FileInfo("1")) }) })
            });

            yield return(new object[] {
                RoseTree.Node("S", new [] { PhotoLeaf("4", 1972, 6, 6, 16, 15, 0) }),
                "D",
                RoseTree.Node("D", new [] { RoseTree.Node("1972-06", new [] { new RoseLeaf <string, FileInfo>(new FileInfo("4")) }) })
            });

            yield return(new object[] {
                RoseTree.Node("S", new [] {
                    PhotoLeaf("L", 2002, 10, 12, 17, 16, 15),
                    PhotoLeaf("J", 2007, 4, 21, 17, 18, 19),
                }),
                "D",
                RoseTree.Node("D", new [] {
                    RoseTree.Node("2002-10", new [] { new RoseLeaf <string, FileInfo>(new FileInfo("L")) }),
                    RoseTree.Node("2007-04", new [] { new RoseLeaf <string, FileInfo>(new FileInfo("J")) }),
                })
            });

            yield return(new object[] {
                RoseTree.Node("1", new [] {
                    PhotoLeaf("a", 2010, 1, 12, 17, 16, 15),
                    PhotoLeaf("b", 2010, 3, 12, 17, 16, 15),
                    PhotoLeaf("c", 2010, 1, 21, 17, 18, 19),
                }),
                "2",
                RoseTree.Node("2", new [] {
                    RoseTree.Node("2010-01", new [] { new RoseLeaf <string, FileInfo>(new FileInfo("a")), new RoseLeaf <string, FileInfo>(new FileInfo("c")) }),
                    RoseTree.Node("2010-03", new [] { new RoseLeaf <string, FileInfo>(new FileInfo("b")) }),
                })
            });

            yield return(new object[] {
                RoseTree.Node("foo",
                              RoseTree.Node("bar", new [] {
                    PhotoLeaf("a", 2010, 1, 12, 17, 16, 15),
                    PhotoLeaf("b", 2010, 3, 12, 17, 16, 15),
                    PhotoLeaf("c", 2010, 1, 21, 17, 18, 19),
                }),
                              RoseTree.Node("baz",
                                            PhotoLeaf("d", 2010, 3, 1, 2, 3, 4),
                                            PhotoLeaf("e", 2011, 3, 4, 3, 2, 1)
                                            )
                              ),
                "qux",
                RoseTree.Node("qux", new [] {
                    RoseTree.Node("2010-01", new [] { new RoseLeaf <string, FileInfo>(new FileInfo("a")), new RoseLeaf <string, FileInfo>(new FileInfo("c")) }),
                    RoseTree.Node("2010-03", new [] { new RoseLeaf <string, FileInfo>(new FileInfo("b")), new RoseLeaf <string, FileInfo>(new FileInfo("d")) }),
                    RoseTree.Node("2011-03", new [] { new RoseLeaf <string, FileInfo>(new FileInfo("e")) }),
                })
            });
        }
Exemplo n.º 3
0
        public void Select()
        {
            var b = RoseTree.Create(1, RoseTree.Singleton(2));
            var c = from i in b select i + 1;
            var d = RoseTree.Create(2, RoseTree.Singleton(3));

            Assert.AreEqual(d, c);
        }
Exemplo n.º 4
0
        private static void PrintTree <T>(RoseTree <T> tree, int level)
        {
            var tabs = new string('\t', level);

            Console.WriteLine(tabs + tree.Root);
            foreach (var c in tree.Children)
            {
                PrintTree(c, level + 1);
            }
        }
Exemplo n.º 5
0
        public void Create()
        {
            // without sugar
            var a = new RoseTree <int>(1, LazyListModule.ofArray(new[] {
                new RoseTree <int>(2, LazyListModule.empty <RoseTree <int> >()),
            }));

            // with sugar (but no laziness)
            var b = RoseTree.Create(1, RoseTree.Create(2));

            Assert.AreEqual(b, a);
        }
Exemplo n.º 6
0
        public void SelectMany2()
        {
            // kind of useless?
            var b = RoseTree.Create(1, RoseTree.Singleton(2));
            var c = b.SelectMany(RoseTree.Singleton, (x, y) => y);

            PrintTree(c, 0);
            var d = RoseTree.Create(1,
                                    RoseTree.Singleton(2),
                                    RoseTree.Create(1, RoseTree.Singleton(2)));

            Assert.AreEqual(d, c);
        }
Exemplo n.º 7
0
 // Impure
 public static IRoseTree <string, string> readTree(string path)
 {
     if (File.Exists(path))
     {
         return(new RoseLeaf <string, string>(path));
     }
     else
     {
         var dirsAndFiles = Directory.EnumerateFileSystemEntries(path);
         var branches     = dirsAndFiles.Select(readTree).ToArray();
         return(RoseTree.Node(path, branches));
     }
 }
Exemplo n.º 8
0
        public void SelectMany()
        {
            var b = RoseTree.Create(1, RoseTree.Singleton(2));
            var c = b.SelectMany(i => {
                if (i <= 1)
                {
                    return(RoseTree.Singleton(i));
                }
                return(RoseTree.Create(i, RoseTree.Singleton(i + 1)));
            });

            PrintTree(c, 0);
            var d = RoseTree.Create(1, RoseTree.Create(2, RoseTree.Singleton(3)));

            Assert.AreEqual(d, c);
        }
Exemplo n.º 9
0
        public void SelectManyLinq()
        {
            // kind of useless?
            var b = RoseTree.Create(1, RoseTree.Singleton(2));
            var c = from i in b
                    let r = i <= 1 ? RoseTree.Singleton(i) : RoseTree.Create(i, RoseTree.Singleton(i + 1))
                            from j in r
                            select j;

            PrintTree(c, 0);
            var d = RoseTree.Create(1,
                                    RoseTree.Create(2, RoseTree.Create(3)),
                                    RoseTree.Create(1,
                                                    RoseTree.Create(2, RoseTree.Create(3))));

            Assert.AreEqual(d, c);
        }
Exemplo n.º 10
0
        public static IRoseTree <string, Move> calculateMoves(IRoseTree <string, FileInfo> tree)
        {
            FileInfo ReplaceDirectory(FileInfo f, string d)
            => new FileInfo(Path.Combine(d, f.Name));

            IRoseTree <string, Move> imp(string path, IRoseTree <string, FileInfo> tree)
            => tree.Match(
                leaf: l => RoseTree.Leaf <string, Move>(new Move {
                Source = l, Destination = ReplaceDirectory(l, path)
            }),
                node: (x, xs) =>
            {
                var newPath = Path.Combine(path, x);
                return(RoseTree.Node <string, Move>(newPath, xs.Select(t => imp(newPath, t)).ToArray()));
            });

            return(imp("", tree));
        }
Exemplo n.º 11
0
        public static IRoseTree <string, FileInfo> moveTo(string destination, IRoseTree <string, PhotoFile> t)
        {
            string dirNameOf(DateTime dt) => dt.ToString("yyyy-MM");


            Dictionary <string, IEnumerable <FileInfo> > groupByDir(Dictionary <string, IEnumerable <FileInfo> > m, PhotoFile pf)
            {
                var key    = dirNameOf(pf.TakenOn);
                var exists = m.TryGetValue(key, out var item);
                IEnumerable <FileInfo> dir;

                if (exists)
                {
                    dir    = item;
                    m[key] = dir.Concat(new List <FileInfo> {
                        pf.File
                    });
                }
                else
                {
                    m.Add(key, new List <FileInfo> {
                        pf.File
                    });
                }

                return(m);
            }

            List <IRoseTree <string, FileInfo> > addDir(IEnumerable <IRoseTree <string, FileInfo> > dirs, KeyValuePair <string, IEnumerable <FileInfo> > pair)
            {
                var name     = pair.Key;
                var files    = pair.Value;
                var branches = files.Select(f => RoseTree.Leaf <string, FileInfo>(f));

                return(dirs.Concat(new[] { RoseTree.Node(name, branches.ToArray()) }).ToList());
            }

            var m = t.Fold((acc, x) => groupByDir(acc, x), new Dictionary <string, IEnumerable <FileInfo> >());

            var dirs = m.Aggregate(new List <IRoseTree <string, FileInfo> >(), addDir);

            return(RoseTree.Node(destination, dirs.ToArray()));
        }
Exemplo n.º 12
0
        public RoseTreeMenuTest()
        {
            commandStore = new Dictionary <string, Command>()
            {
                { "Find", new FindCommand("Find") }
            };

            editMenuTemplate =
                RoseTree.Node("Edit",
                              RoseTree.Node("Find and Replace",
                                            new RoseLeaf <string, string>("Find"),
                                            new RoseLeaf <string, string>("Replace")),
                              RoseTree.Node("Case",
                                            new RoseLeaf <string, string>("Upper"),
                                            new RoseLeaf <string, string>("Lower")),
                              new RoseLeaf <string, string>("Cut"),
                              new RoseLeaf <string, string>("Copy"),
                              new RoseLeaf <string, string>("Paste"));
        }
Exemplo n.º 13
0
 private static RoseTree <T> R <T>(T root, params RoseTree <T>[] children)
 {
     return(RoseTree.Create(root, children));
 }