--   $Id$

module Autolib.FilterBound 

( filterBound )

where

-- | sobald ein positives Element gefunden,
-- untersuche nur noch die jeweils  b  nächsten
filterBound :: Int -> (a -> Bool) -> [a] -> [a]
filterBound :: forall a. Int -> (a -> Bool) -> [a] -> [a]
filterBound Int
b a -> Bool
p [a]
xs =
    case (a -> Bool) -> [a] -> [a]
forall a. (a -> Bool) -> [a] -> [a]
dropWhile (Bool -> Bool
not (Bool -> Bool) -> (a -> Bool) -> a -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> Bool
p) [a]
xs of
	 [] -> []
	 a
x : [a]
rest -> a
x a -> [a] -> [a]
forall a. a -> [a] -> [a]
: Int -> (a -> Bool) -> [a] -> [a]
forall a. Int -> (a -> Bool) -> [a] -> [a]
restFilterBound Int
b a -> Bool
p [a]
rest

restFilterBound :: Int -> (a -> Bool) -> [a] -> [a]
restFilterBound Int
b a -> Bool
p [a]
xs =
    let ([a]
pre, [a]
post) = Int -> [a] -> ([a], [a])
forall a. Int -> [a] -> ([a], [a])
splitAt Int
b [a]
xs
    in	case (a -> Bool) -> [a] -> [a]
forall a. (a -> Bool) -> [a] -> [a]
filter a -> Bool
p [a]
pre of
		 [] -> [] -- Schluß
		 [a]
ys -> [a]
ys [a] -> [a] -> [a]
forall a. [a] -> [a] -> [a]
++ Int -> (a -> Bool) -> [a] -> [a]
restFilterBound Int
b a -> Bool
p [a]
post