module Autolib.FilterBound
( filterBound )
where
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
[] -> []
[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