@@ -12,6 +12,7 @@ import Prelude.Nat
1212%access public
1313%default total
1414
15+infix 5 \\
1516infixr 7 ::,++
1617
1718%elim data List a
@@ -399,6 +400,22 @@ nubBy = nubBy' []
399400nub : Eq a => List a -> List a
400401nub = nubBy (==)
401402
403+deleteBy : (a -> a -> Bool) -> a -> List a -> List a
404+deleteBy _ _ [] = []
405+deleteBy eq x (y::ys) = if x `eq` y then ys else y :: deleteBy eq x ys
406+
407+delete : (Eq a) => a -> List a -> List a
408+delete = deleteBy (==)
409+
410+(\\) : (Eq a) => List a -> List a -> List a
411+(\\) = foldl (flip delete)
412+
413+unionBy : (a -> a -> Bool) -> List a -> List a -> List a
414+unionBy eq xs ys = xs ++ foldl (flip (deleteBy eq)) (nubBy eq ys) xs
415+
416+union : (Eq a) => List a -> List a -> List a
417+union = unionBy (==)
418+
402419--------------------------------------------------------------------------------
403420-- Splitting and breaking lists
404421--------------------------------------------------------------------------------
@@ -439,6 +456,16 @@ partition p (x::xs) =
439456 else
440457 (lefts, x::rights)
441458
459+inits : List a -> List (List a)
460+inits xs = [] :: case xs of
461+ [] => []
462+ x :: xs' => map (x ::) (inits xs')
463+
464+tails : List a -> List (List a)
465+tails xs = xs :: case xs of
466+ [] => []
467+ _ :: xs' => tails xs'
468+
442469--------------------------------------------------------------------------------
443470-- Predicates
444471--------------------------------------------------------------------------------