Add groupWith, sortWith, the, to support generalised list comprehensions
[ghc-base.git] / GHC / Exts.hs
1 -----------------------------------------------------------------------------
2 -- |
3 -- Module      :  GHC.Exts
4 -- Copyright   :  (c) The University of Glasgow 2002
5 -- License     :  see libraries/base/LICENSE
6 -- 
7 -- Maintainer  :  cvs-ghc@haskell.org
8 -- Stability   :  internal
9 -- Portability :  non-portable (GHC Extensions)
10 --
11 -- GHC Extensions: this is the Approved Way to get at GHC-specific extensions.
12 --
13 -----------------------------------------------------------------------------
14
15 module GHC.Exts
16        (
17         -- * Representations of some basic types
18         Int(..),Word(..),Float(..),Double(..),Integer(..),Char(..),
19         Ptr(..), FunPtr(..),
20
21         -- * Primitive operations
22         module GHC.Prim,
23         shiftL#, shiftRL#, iShiftL#, iShiftRA#, iShiftRL#,
24         uncheckedShiftL64#, uncheckedShiftRL64#,
25         uncheckedIShiftL64#, uncheckedIShiftRA64#,
26
27         -- * Fusion
28         build, augment,
29
30         -- * Overloaded string literals
31         IsString(..),
32
33         -- * Debugging
34         breakpoint, breakpointCond,
35
36         -- * Ids with special behaviour
37         lazy, inline,
38
39         -- * Transform comprehensions
40         groupWith, sortWith, the
41
42        ) where
43
44 import Prelude
45
46 import GHC.Prim
47 import GHC.Base
48 import GHC.Word
49 import GHC.Int
50 import GHC.Num
51 import GHC.Float
52 import GHC.Ptr
53 import Data.String
54 import Data.List
55
56 -- | 'the' ensures that all the elements of the list are identical
57 -- and then returns that unique element
58 the :: Eq a => [a] -> a
59 the (x:xs) 
60   | all (x ==) xs = x
61   | otherwise     = error "GHC.Exts.the: non-identical elements"
62 the []            = error "GHC.Exts.the: empty list"
63
64 -- | The 'sortWith' function sorts a list of elements using the
65 -- user supplied function to project something out of each element
66 sortWith :: Ord b => (a -> b) -> [a] -> [a]
67 sortWith f = sortBy (\x y -> compare (f x) (f y))
68
69 -- | The 'groupWith' function uses the user supplied function which
70 -- projects an element out of every list element in order to to first sort the 
71 -- input list and then to form groups by equality on these projected elements
72 groupWith :: Ord b => (a -> b) -> [a] -> [[a]]
73 groupWith f = groupBy (\x y -> f x == f y) . sortWith f