-- | -- Module : Data.Edison.Coll.Utils -- Copyright : Copyright (c) 1998 Chris Okasaki -- License : MIT; see COPYRIGHT file for terms and conditions -- -- Maintainer : robdockins AT fastmail DOT fm -- Stability : stable -- Portability : GHC, Hugs (MPTC and FD) -- -- This module provides implementations of several useful operations -- that are not included in the collection classes themselves. This is -- usually because the operation involves transforming a collection into a -- different type of collection; such operations cannot be typed using -- the collection classes without significantly complicating them. -- -- Be aware that these functions are defined using the external class -- interfaces and may be less efficient than corresponding, but more -- restrictively typed, functions in the collection classes. module Data.Edison.Coll.Utils where import Prelude hiding (map,null,foldr,foldl,foldr1,foldl1,lookup,filter) import Data.Edison.Coll -- | Apply a function across all the elements in a collection and transform -- the collection type. map :: (Coll cin a, CollX cout b) => (a -> b) -> (cin -> cout) map f xs = fold (\x ys -> insert (f x) ys) empty xs -- | Map a partial function across all elements of a collection and transform -- the collection type. mapPartial :: (Coll cin a, CollX cout b) => (a -> Maybe b) -> (cin -> cout) mapPartial f xs = fold (\ x ys -> case f x of Just y -> insert y ys Nothing -> ys) empty xs -- | Map a monotonic function across all the elements of a collection and -- transform the collection type. The function is required to satisfy -- the following precondition: -- -- > forall x y. x < y ==> f x < f y unsafeMapMonotonic :: (OrdColl cin a, OrdCollX cout b) => (a -> b) -> (cin -> cout) unsafeMapMonotonic f xs = foldr (unsafeInsertMin . f) empty xs -- | Map a collection-producing function across all elements of a collection -- and collect the results together using 'union'. unionMap :: (Coll cin a, CollX cout b) => (a -> cout) -> (cin -> cout) unionMap f xs = fold (\x ys -> union (f x) ys) empty xs