> module Sorttags
>        (sorttags)
>        where

> import Data.List.Split

> alters :: [t] -> [[t]]
> alters x = [x] ++ [[]] ++ alters x 

> fix :: [a] -> [[a]] -> [[a]]
> fix x l = zipWith (++) l (alters x)

> splitOnFirst :: Eq a => [a] -> [a] -> [[a]]
> splitOnFirst x l | length (splitOn x l) == 1 = splitOn x l
>                  | length (splitOn x l) == 2 = splitOn x l 
>                  | otherwise = [head (splitOn x l)] ++
>                                [concat (fix x (tail (splitOn x l)))]

> f :: Eq a => [a] -> [a] -> [[a]]
> f p1 l = splitOn p1 l

> g :: Eq a => [a] -> [a] -> [[a]]
> g p2 l = splitOnFirst p2 l

> h :: Eq a => [a] -> [a] -> [a] -> [[[a]]]
> h p1 p2 l = map (g p2) (f p1 l)

> errormess :: String -> String
> errormess l = "\n\n During document generation, an error was "    ++
>                   "generated from Sorttags.lhs line " ++ l ++ ", probably "      ++
>                   "because of bad syntax in the input file\n\n"


> j :: [Char] -> [Char] -> ([Char] -> [Char]) -> [[Char]] -> [Char]
> j p1 p2 fun [x,y] = p1 ++ fun x ++ p2 ++ y
> j _ _ _ []        = errormess "35"
> j _ _ _ [_]       = errormess "36"
> j _ _ _ (_:_:_:_) = errormess "37"

> sorttags :: [Char] -> [Char] -> ([Char] -> [Char]) -> [Char] -> [Char]
> sorttags p1 p2 fun l = concat (head (h p1 p2 l) ++
>                                map (j p1 p2 fun) (tail (h p1 p2 l)))

