packages feed

halipeto-2.3: Halipeto/Utilities.lhs

%
% Halipeto -- Haskell static web page generator
% Copyright 2004 Andrew Cooke (andrew@acooke.org)
% Copyright 2007-2010 Peter Simons (simons@cryp.to)
%
%     This program is free software; you can redistribute it and/or modify
%     it under the terms of the GNU General Public License as published by
%     the Free Software Foundation; either version 2 of the License, or
%     (at your option) any later version.
%
%     This program is distributed in the hope that it will be useful,
%     but WITHOUT ANY WARRANTY; without even the implied warranty of
%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
%     GNU General Public License for more details.
%
%     You should have received a copy of the GNU General Public License
%     along with this program; if not, write to the Free Software
%     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
%

\section{Utilities}

Various general routines.

\begin{code}
module Halipeto.Utilities (
  slash, toSlash, fromSlash, toSep, fromSep, dropSpace,
  mapT2, mapT3,
  thenMaybe
) where

import Data.Char
\end{code}

Concatenation of paths and files.

\begin{code}
slash' :: Char
slash' = '/'
\end{code}
%%Haddock: Concatenate two directories
\begin{code}
slash :: String -> String -> String
slash p f = if null f || head f == slash' || null p || last p == slash'
              then p ++ f
              else p ++ [slash'] ++ f
\end{code}
%%Haddock: Convert a list of directories to a file path
\begin{code}
toSlash :: [String] -> FilePath
toSlash = foldl slash ""
\end{code}
%%Haddock: Convert a file path to a list of directories
\begin{code}
fromSlash :: FilePath -> [String]
fromSlash = fromSep slash'
\end{code}

Separation and expansion of strings.

%%Haddock: Join a list with a given separator character
\begin{code}
toSep :: Char -> [String] -> String
toSep  _  []     = undefined
toSep  _  [s]    = s
toSep sep (s:ss) = s ++ [sep] ++ toSep sep ss
\end{code}
%%Haddock: Split a list on a given separator character
\begin{code}
fromSep :: Char -> String -> [String]
fromSep sep s' = uncurry (:) $ foldr f ("", []) s'
  where
    f c (s, l) | c == sep && l == [] && s == "" = ("", l)
               | c == sep                       = ("", s:l)
               | otherwise                      = (c:s, l)
\end{code}

Remove space from the start of a string.

%%Haddock: Drop leading spaces
\begin{code}
dropSpace :: String -> String
dropSpace ""                = ""
dropSpace (c:s) | isSpace c = dropSpace s
                | otherwise = (c:s)
\end{code}

Maps over uniform tuples.

%%Haddock: Map over a uniform tuple
\begin{code}
mapT2 :: (a -> b) -> (a, a) -> (b, b)
mapT2 f (x1, x2) = (f x1, f x2)
\end{code}
%%Haddock: Map over a uniform triple
\begin{code}
mapT3 :: (a -> b) -> (a, a, a) -> (b, b, b)
mapT3 f (x1, x2, x3) = (f x1, f x2, f x3)
\end{code}

Chain functions that return Maybe.

%%Haddock: Chain Maybe functions
\begin{code}
thenMaybe :: (a -> Maybe b) -> (b -> Maybe c) -> (a -> Maybe c)
thenMaybe f1 f2 a = case f1 a of
                     Nothing -> Nothing
                     Just a' -> f2 a'
\end{code}