X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Flib%2Fstd%2FList.lhs;h=4633099db8be49369d025e97c73648afdd93a940;hb=ec2e177faf6ed8ff934f0bd97cf77fcb0f2210bd;hp=709687a56f45187dcba8f968fd6e6bca6e41c8a2;hpb=7c342f5eac88acf2e2a962146fddcc7e3b93529c;p=ghc-hetmet.git diff --git a/ghc/lib/std/List.lhs b/ghc/lib/std/List.lhs index 709687a..4633099 100644 --- a/ghc/lib/std/List.lhs +++ b/ghc/lib/std/List.lhs @@ -1,8 +1,10 @@ +% ----------------------------------------------------------------------------- +% $Id: List.lhs,v 1.13 2001/08/29 10:12:34 simonmar Exp $ % -% (c) The AQUA Project, Glasgow University, 1994-1999 +% (c) The University of Glasgow, 1994-2000 % -\section[List]{Module @Lhar@} +\section[List]{Module @List@} \begin{code} module List @@ -65,7 +67,7 @@ module List , genericIndex -- :: (Integral a) => [b] -> a -> b , genericReplicate -- :: (Integral a) => a -> b -> [b] - , unfoldr -- :: (a -> Maybe (b,a)) -> a -> (a,[b]) + , unfoldr -- :: (b -> Maybe (a, b)) -> b -> [a] , zip4, zip5, zip6, zip7 , zipWith4, zipWith5, zipWith6, zipWith7 @@ -207,14 +209,18 @@ nubBy eq (x:xs) = x : nubBy eq (filter (\ y -> not (eq x y)) xs) nubBy eq l = nubBy' l [] where nubBy' [] _ = [] - nubBy' (x:xs) ls - | elemBy eq x ls = nubBy' xs ls - | otherwise = x : nubBy' xs (x:ls) - ---not exported: -elemBy :: (a -> a -> Bool) -> a -> [a] -> Bool -elemBy _ _ [] = False -elemBy eq x (y:ys) = x `eq` y || elemBy eq x ys + nubBy' (y:ys) xs + | elem_by eq y xs = nubBy' ys xs + | otherwise = y : nubBy' ys (y:xs) + +-- Not exported: +-- Note that we keep the call to `eq` with arguments in the +-- same order as in the reference implementation +-- 'xs' is the list of things we've seen so far, +-- 'y' is the potential new element +elem_by :: (a -> a -> Bool) -> a -> [a] -> Bool +elem_by _ _ [] = False +elem_by eq y (x:xs) = x `eq` y || elem_by eq y xs #endif @@ -317,13 +323,21 @@ insertBy cmp x ys@(y:ys') GT -> y : insertBy cmp x ys' _ -> x : ys -maximumBy :: (a -> a -> a) -> [a] -> a -maximumBy _ [] = error "List.maximumBy: empty list" -maximumBy max xs = foldl1 max xs - -minimumBy :: (a -> a -> a) -> [a] -> a -minimumBy _ [] = error "List.minimumBy: empty list" -minimumBy min xs = foldl1 min xs +maximumBy :: (a -> a -> Ordering) -> [a] -> a +maximumBy _ [] = error "List.maximumBy: empty list" +maximumBy cmp xs = foldl1 max xs + where + max x y = case cmp x y of + GT -> x + _ -> y + +minimumBy :: (a -> a -> Ordering) -> [a] -> a +minimumBy _ [] = error "List.minimumBy: empty list" +minimumBy cmp xs = foldl1 min xs + where + min x y = case cmp x y of + GT -> y + _ -> x genericLength :: (Num i) => [b] -> i genericLength [] = 0