public override Expression Build(IEnumerable <Expression> arguments)
        {
            var source          = arguments.First();
            var parameterType   = source.Type.GetGenericArguments()[0];
            var valueParameter  = Expression.Parameter(typeof(object));
            var viewParameter   = Expression.Parameter(typeof(RollingGraphVisualizer));
            var elementVariable = Expression.Variable(parameterType);

            Controller          = new VisualizerController();
            Controller.Capacity = Capacity.GetValueOrDefault();

            var selectedIndex = GraphHelper.SelectIndexMember(elementVariable, IndexSelector, out Controller.IndexLabel);

            Controller.IndexType = selectedIndex.Type;
            if (selectedIndex.Type != typeof(double) && selectedIndex.Type != typeof(string))
            {
                selectedIndex = Expression.Convert(selectedIndex, typeof(double));
            }

            var selectedValues = GraphHelper.SelectDataValues(elementVariable, ValueSelector, out Controller.ValueLabels);
            var showBody       = Expression.Block(new[] { elementVariable },
                                                  Expression.Assign(elementVariable, Expression.Convert(valueParameter, parameterType)),
                                                  Expression.Call(viewParameter, nameof(RollingGraphVisualizer.AddValues), null, selectedIndex, selectedValues));

            Controller.AddValues = Expression.Lambda <Action <object, RollingGraphVisualizer> >(showBody, valueParameter, viewParameter).Compile();
            return(Expression.Call(typeof(RollingGraphBuilder), nameof(Process), new[] { parameterType }, source));
        }
        public override Expression Build(IEnumerable <Expression> arguments)
        {
            var source          = arguments.First();
            var parameterType   = source.Type.GetGenericArguments()[0];
            var valueParameter  = Expression.Parameter(typeof(object));
            var viewParameter   = Expression.Parameter(typeof(LineGraphVisualizer));
            var elementVariable = Expression.Variable(parameterType);

            Controller            = new VisualizerController();
            Controller.Capacity   = Capacity.GetValueOrDefault();
            Controller.SymbolType = SymbolType;
            Controller.LineWidth  = LineWidth;

            var selectedValues = GraphHelper.SelectDataPoints(elementVariable, ValueSelector, out Controller.ValueLabels);
            var addValuesBody  = Expression.Block(new[] { elementVariable },
                                                  Expression.Assign(elementVariable, Expression.Convert(valueParameter, parameterType)),
                                                  Expression.Call(viewParameter, nameof(LineGraphVisualizer.AddValues), null, selectedValues));

            Controller.AddValues = Expression.Lambda <Action <object, LineGraphVisualizer> >(addValuesBody, valueParameter, viewParameter).Compile();
            return(Expression.Call(typeof(LineGraphBuilder), nameof(Process), new[] { parameterType }, source));
        }