module Data.List.Tools (
  takeUntil
, dropUntil
, mulLists
, defaultElem
, isIncludedElem
) where

takeUntil :: (a -> Bool) -> [a] -> [a]
dropUntil :: (a -> Bool) -> [a] -> [a]
takeUntil _ []     = []
takeUntil p (x:xs)
  | p x            = [x]
  | otherwise      = x : takeUntil p xs
dropUntil _ []     = []
dropUntil p (x:xs)
  | p x            = xs
  | otherwise      = dropUntil p xs

mulLists :: [[a]] -> [[a]]
mulLists []       = [[]]
mulLists (xs:xss) = [ x:xs_ | x <- xs, xs_ <- mulLists xss ]

defaultElem :: a -> [a] -> [a]
defaultElem dflt []  = [ dflt ]
defaultElem _    lst = lst

isIncludedElem :: Eq a => [a] -> [a] -> Bool
isIncludedElem lst1 lst2 = and $ map (flip elem lst2) lst1