module Data.Sequence.Extended
  ( module Data.Sequence
  , module Data.Sequence.Extended
  ) where

import Data.Sequence

-- | Finds the leftmost element that satisfies the predicate.
--   Returns (prefix, element, suffix).
findl :: (a -> Bool) -> Seq a -> Maybe (Seq a, a, Seq a)
findl p s =
  case breakl p s of
    (prefix, rest) ->
      case viewl rest of
        EmptyL      -> Nothing
        a :< suffix -> Just (prefix, a, suffix)

-- | Finds the rightmost element that satisfies the predicate.
--   Returns (suffix, element, prefix).
findr :: (a -> Bool) -> Seq a -> Maybe (Seq a, a, Seq a)
findr p s =
  case breakr p s of
    (suffix, rest) ->
      case viewr rest of
        EmptyR      -> Nothing
        prefix :> a -> Just (suffix, a, prefix)