1  module StdLib where
    2  pair :: a -> b -> (a,b)
    3  pair a b = (a,b)
    4  fstcons :: a -> ([a],b) -> ([a],b)
    5  fstcons a (as,b) = (a:as,b)
    6  sndcons :: b -> (a,[b]) -> (a,[b])
    7  sndcons b (a,bs) = (a,b:bs)
    8 
    9  map2 f [] _ = []
   10  map2 f _ [] = []
   11  map2 f (a:l) (b:k) = f a b:map2 f l k
   12 
   13  mapcat :: (a->[b]) -> [a] -> [b]
   14  mapcat f [] = []
   15  mapcat f (a:l) = f a ++ mapcat f l
   16  sort :: Ord a => [a] -> [a]
   17  sort [] = []
   18  sort (a:l) = (sort low) ++ [a] ++ (sort high)
   19         where         (low,high) = group a l
   20  group :: Ord a => a -> [a] -> ([a],[a])
   21  group _ [] = ([],[])
   22  group i (a:l) = f (group i l) 
   23                 where f (low,high) | a<i = (a:low,high)
   24                                    | otherwise = (low,a:high)
   25  insert :: Ord a => a -> [a] -> [a]
   26  insert a [] = [a]
   27  insert a as@(x:xs) | x>a = a:as
   28                      | otherwise = x:insert a xs
   29  replace :: Eq a => a -> [a] -> [a]
   30  replace a [] = []
   31  replace a (x:xs) | a == x = a:xs 
   32                    | otherwise = x:replace a xs
   33  remove :: Eq a => a -> [a] -> [a]
   34  remove a [] = []
   35  remove a (x:xs) | a==x = xs
   36                   | otherwise = x:remove a xs
   37  collect :: Ord a => (b->a) -> [a] -> [b] -> [b]
   38  collect _ [] _ = []
   39  collect _ _ [] = []
   40  collect p as@(a:l) bs@(b:k) | a==p b = b:collect p l k
   41                               | p b > a = collect p l bs
   42                               | otherwise = collect p as k
   43  span' :: (a->Bool) -> [a] -> ([a],[a])
   44  span' p [] = ([],[])
   45  span' p (x:xs') | p x = fixLeak x (span' p xs') where fixLeak x (xs,ys) = (x:xs,ys)
   46  span' _ xs = ([],xs)
   47  lines' :: [Char] -> [[Char]]
   48  lines' "" = []
   49  lines' s = plumb (span' ((/=) '\n') s)
   50         where   plumb (l,s') = l:if null s' then [] else lines' (tail s')
   51  strToInt :: String -> Int
   52  strToInt x = strToInt' (length x-1) x
   53        where   strToInt' _ [] = 0
   54                strToInt' x (a:l) = (charToInt a)*(10^x) + (strToInt' (x-1) l)
   55  charToInt :: Char -> Int
   56  charToInt x = (fromEnum x - fromEnum '0')