using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.Remoting.Messaging; using System.Threading.Tasks; using GameOfLife.Entities; using GameOfLife.IO; namespace GameOfLife.Search { public class LibrarySearcher { private readonly PatternLibrary _patternLibrary; private Dictionary> _cellPatterns; public LibrarySearcher(PatternLibrary patternLibrary) { _patternLibrary = patternLibrary; var cellPatterns = from patternProjections in _patternLibrary.PatternProjections from projection in patternProjections.Item2 from cell in projection group projection by cell into cellGroups select cellGroups; _cellPatterns = cellPatterns.ToDictionary(t => t.Key, t => t.ToList()); } //public IEnumerable> MatchLibraryPatternsLookup(IEnumerable cells) //{ // var pattern = cells.ToPattern(); //} public IEnumerable> MatchLibraryPatterns(IEnumerable cells) { var inputCells = cells.ToPattern(); var matches = new ConcurrentBag>(); Parallel.ForEach(_patternLibrary.PatternProjections, tuple => { var patternMetadata = tuple.Item1; var projections = tuple.Item2; var foundPatterns = inputCells.FindPatterns_Serial(projections).ToArray(); if (foundPatterns.Any()) matches.Add(Tuple.Create(patternMetadata, foundPatterns.ToArray())); } ); return matches; } } }