protected virtual IEnumerable <string> SolveAnySignal(IComponent component)
        {
            //throw new NotImplementedException();
            if (component.Type == Constant.CONSTANT)
            {
                yield return(((Constant)component).Id + "a");

                yield break;
            }

            if (component.Type == Splitter.SPLITTER)
            {
                SplitterInfo splitterInfo = GetSplitterInfo((Splitter)component);

                if (!(splitterInfo.LockedSplitter is null))
                {
                    yield return("");

                    yield break;
                }

                splitterInfo.AnyCount++;
                if (splitterInfo.AnyCount == splitterInfo.MaxOutputs) //TODO: Algorithm breaks if not all outputs of the splitter are connected.
                {
                    foreach (string anySolution in SolveAnySignal(component.Inputs[0]))
                    {
                        yield return(anySolution);
                    }

                    splitterInfo.AnyCount--;
                    yield break;
                }

                yield return("");

                splitterInfo.AnyCount--;
                yield break;
            }


            if (component.Type == Not.NOT)
            {
                foreach (string any in SolveAnySignal(component.Inputs[0]))
                {
                    yield return(any);
                }
                yield break;
            }

            //Hard coded two inputs:
            foreach (string anyLeft in SolveAnySignal(component.Inputs[0]))
            {
                foreach (string anyRight in SolveAnySignal(component.Inputs[1]))
                {
                    yield return(anyLeft + anyRight);
                }
            }
        }
 private void UpdateSplitterDistance(SplitterInfo splitterInfo)
 {
     if (_splitter.Orientation == Orientation.Horizontal)
     {
         _splitter.SplitterDistance = ViewsManager.GetChildDimensionFromPercentage(_splitter.Height, splitterInfo.HorizontalPercentage);
     }
     else
     {
         _splitter.SplitterDistance = ViewsManager.GetChildDimensionFromPercentage(_splitter.Width, splitterInfo.VerticalPercentage);
     }
 }
 private void UpdateSplitterInfo(SplitterInfo splitterInfo)
 {
     if (_splitter.Orientation == Orientation.Horizontal)
     {
         splitterInfo.HorizontalPercentage = ViewsManager.GetChildPercentageFromDimension(_splitter.Height, _splitter.SplitterDistance);
     }
     else
     {
         splitterInfo.VerticalPercentage = ViewsManager.GetChildPercentageFromDimension(_splitter.Width, _splitter.SplitterDistance);
     }
 }
        protected SplitterInfo GetSplitterInfo(Splitter splitter)
        {
            if (_splitterInfoLookup.TryGetValue(splitter, out SplitterInfo splitterInfo))
            {
                return(splitterInfo);
            }

            splitterInfo = new SplitterInfo(splitter.MaxOutputs);
            _splitterInfoLookup.Add(splitter, splitterInfo);

            return(splitterInfo);
        }
        private IEnumerable <string> SolveSplitter(bool requestedSignal, IComponent splitter)
        {
            SplitterInfo splitterInfo = GetSplitterInfo((Splitter)splitter);
            IComponent   input        = splitter.Inputs[0];

            if (splitterInfo.LockedSplitter is null)
            {
                splitterInfo.LockedSplitter = requestedSignal;
                foreach (string solution in Solve(requestedSignal, input))
                {
                    yield return(solution);
                }

                splitterInfo.LockedSplitter = null;
                yield break;
            }

            if (splitterInfo.LockedSplitter != requestedSignal)
            {
                yield break;
            }

            yield return("");
        }