%
% 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
%
% EXCEPT
%
% Files in FromHaxml are from HaXml - http://www.cs.york.ac.uk/HaXml -
% see the COPYRIGHT and LICENSE in that directory. The files included
% are a subset of the full HaXml distribution and have been modified to
% originate from the FromHaxml module (so that install on Win32 is
% easy).
%
\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}