X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fcompiler%2Futils%2FOrdList.lhs;h=7f22b38e495a0af306f935f7b9aa8fa8a6696cfe;hb=423d477bfecd490de1449c59325c8776f91d7aac;hp=3e68eb79c203649e4c8af9bc6f2ab0a943ab1680;hpb=68b648e72dde323b9c33442155948d551dd3c9f0;p=ghc-hetmet.git diff --git a/ghc/compiler/utils/OrdList.lhs b/ghc/compiler/utils/OrdList.lhs index 3e68eb7..7f22b38 100644 --- a/ghc/compiler/utils/OrdList.lhs +++ b/ghc/compiler/utils/OrdList.lhs @@ -11,7 +11,7 @@ can be appended in linear time. module OrdList ( OrdList, nilOL, isNilOL, unitOL, appOL, consOL, snocOL, concatOL, - fromOL, toOL, foldOL + fromOL, toOL, foldrOL, foldlOL ) where infixl 5 `appOL` @@ -48,11 +48,26 @@ appOL None bs = bs appOL as None = as appOL as bs = Two as bs -foldOL :: (a->b->b) -> b -> OrdList a -> b -foldOL k z None = z -foldOL k z (One x) = k x z -foldOL k z (Two b1 b2) = foldOL k (foldOL k z b2) b1 -foldOL k z (Many xs) = foldr k z xs +mapOL :: (a -> b) -> OrdList a -> OrdList b +mapOL f None = None +mapOL f (One x) = One (f x) +mapOL f (Two x y) = Two (mapOL f x) (mapOL f y) +mapOL f (Many xs) = Many (map f xs) + +instance Functor OrdList where + fmap = mapOL + +foldrOL :: (a->b->b) -> b -> OrdList a -> b +foldrOL k z None = z +foldrOL k z (One x) = k x z +foldrOL k z (Two b1 b2) = foldrOL k (foldrOL k z b2) b1 +foldrOL k z (Many xs) = foldr k z xs + +foldlOL :: (b->a->b) -> b -> OrdList a -> b +foldlOL k z None = z +foldlOL k z (One x) = k z x +foldlOL k z (Two b1 b2) = foldlOL k (foldlOL k z b1) b2 +foldlOL k z (Many xs) = foldl k z xs fromOL :: OrdList a -> [a] fromOL ol