/// <summary>シーケンス内に指定した要素が存在する場合、その位置へ移動する。</summary>
 /// <typeparam name="T">要素の型</typeparam>
 /// <param name="scroller">対象インスタンス</param>
 /// <param name="element">要素</param>
 /// <returns>結果</returns>
 public static ResultWithValue <IElementScroller <T> > TryMoveTo <T>(this IElementScroller <T> scroller, T element)
 {
     if (scroller.GetSequence().Contains(element))
     {
         return(new ResultWithValue <IElementScroller <T> >(scroller.MoveTo(element)));
     }
     else
     {
         return(new ResultWithValue <IElementScroller <T> >(false, scroller));
     }
 }
 /// <summary>シーケンス内に条件を満たす要素が存在する場合、最後に見つかった要素の位置へ移動する。</summary>
 /// <typeparam name="T">要素の型</typeparam>
 /// <param name="scroller">対象インスタンス</param>
 /// <param name="predicate">条件</param>
 /// <returns>結果</returns>
 public static ResultWithValue <IElementScroller <T> > MaybeLast <T>(this IElementScroller <T> scroller, Predicate <T> predicate)
 {
     if (scroller.GetSequence().Any(x => predicate(x)))
     {
         return(new ResultWithValue <IElementScroller <T> >(scroller.Last(predicate)));
     }
     else
     {
         return(new ResultWithValue <IElementScroller <T> >(false, scroller));
     }
 }
 /// <summary>現在の位置より前にあるシーケンスから現在のノードに近い順のシーケンスを取得する。</summary>
 static IEnumerable <T> previousSequence <T>(this IElementScroller <T> scroller)
 {
     return(scroller.GetSequence()
            .TakeWhile(x => !Equals(x, scroller.Current))
            .Reverse());
 }
 /// <summary>現在の位置が巡回シーケンスの最後かどうかを示す値を取得する。</summary>
 /// <typeparam name="T">要素の型</typeparam>
 /// <param name="scroller">対象インスタンス</param>
 /// <param name="predicate">条件を表す関数</param>
 public static bool IsLast <T>(this IElementScroller <T> scroller, Predicate <T> predicate)
 {
     return(Equals(scroller.Current, scroller.GetSequence().LastOrDefault(x => predicate(x))));
 }
 /// <summary>現在の位置の後ろに続くシーケンスを取得する。</summary>
 static IEnumerable <T> nextSequence <T>(this IElementScroller <T> scroller)
 {
     return(scroller.GetSequence()
            .SkipWhile(x => !Equals(x, scroller.Current))
            .Skip(1));
 }
        /// <summary>シーケンス内の条件を満たす最後の位置へ移動する。</summary>
        /// <typeparam name="T">要素の型</typeparam>
        /// <param name="scroller">対象インスタンス</param>
        /// <param name="predicate">条件</param>
        public static IElementScroller <T> Last <T>(this IElementScroller <T> scroller, Predicate <T> predicate)
        {
            var s = scroller.GetSequence().Last(x => predicate(x));

            return(scroller.MoveTo(s));
        }
 /// <summary>シーケンス内の最後の位置へ移動する。</summary>
 /// <typeparam name="T">要素の型</typeparam>
 /// <param name="scroller">対象インスタンス</param>
 public static IElementScroller <T> Last <T>(this IElementScroller <T> scroller)
 {
     //return scroller.Move(scroller.GetSequence().Count() - scroller.CurrentIndex - 1);
     return(scroller.MoveTo(scroller.GetSequence().Count() - 1));
 }