/// <summary>
        /// Registers a source and also allows a given action on all objects coming from this source.
        /// </summary>
        public static void RegisterSource(this IOsmStreamTarget target, IEnumerable <OsmGeo> source, Action <OsmGeo> channel)
        {
            var filter = new OsmStreamFilterDelegate();

            filter.RegisterSource(source);
            filter.MoveToNextEvent = (osmGeo, param) =>
            {
                channel(osmGeo);
                return(osmGeo);
            };
            target.RegisterSource(filter);
        }
        /// <summary>
        /// Registers a source but keeps only the objects that satify a given condition.
        /// </summary>
        public static void RegisterSource(this IOsmStreamTarget target, IEnumerable <OsmGeo> source, Func <OsmGeo, bool> keep)
        {
            var filter = new OsmStreamFilterDelegate();

            filter.RegisterSource(source);
            filter.MoveToNextEvent = (osmGeo, param) =>
            {
                if (keep(osmGeo))
                {
                    return(osmGeo);
                }
                return(null);
            };
            target.RegisterSource(filter);
        }
 /// <summary>
 /// Registers a source on this target.
 /// </summary>
 public static void RegisterSource(this IOsmStreamTarget target, IEnumerable <OsmGeo> source)
 {
     target.RegisterSource(new OsmEnumerableStreamSource(source));
 }