% % 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}