From d66ef9b057ecd7570e23a47b22bc6ad40d0bfc62 Mon Sep 17 00:00:00 2001 From: Greg Weber Date: Tue, 22 Nov 2011 08:06:35 -0600 Subject: [PATCH] clarify findOverlaps RouteParsing code --- yesod-core/Yesod/Internal/RouteParsing.hs | 28 ++++++++++++++--------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/yesod-core/Yesod/Internal/RouteParsing.hs b/yesod-core/Yesod/Internal/RouteParsing.hs index 8a37a496..6ce784ac 100644 --- a/yesod-core/Yesod/Internal/RouteParsing.hs +++ b/yesod-core/Yesod/Internal/RouteParsing.hs @@ -331,18 +331,24 @@ pieceFromString ('#':x) = SinglePiece x pieceFromString ('*':x) = MultiPiece x pieceFromString x = StaticPiece x +-- this is n^2, should be a way to speed it up findOverlaps :: [Resource] -> [(Resource, Resource)] -findOverlaps = gos . map justPieces +findOverlaps = go . map justPieces where + justPieces :: Resource -> ([Piece], Resource) justPieces r@(Resource _ ps _) = (ps, r) - gos [] = [] - gos (x:xs) = mapMaybe (go x) xs ++ gos xs - go (StaticPiece x:xs, xr) (StaticPiece y:ys, yr) - | x == y = go (xs, xr) (ys, yr) + + go [] = [] + go (x:xs) = mapMaybe (mOverlap x) xs ++ go xs + + mOverlap :: ([Piece], Resource) -> ([Piece], Resource) -> + Maybe (Resource, Resource) + mOverlap (StaticPiece x:xs, xr) (StaticPiece y:ys, yr) + | x == y = mOverlap (xs, xr) (ys, yr) | otherwise = Nothing - go (MultiPiece _:_, xr) (_, yr) = Just (xr, yr) - go (_, xr) (MultiPiece _:_, yr) = Just (xr, yr) - go ([], xr) ([], yr) = Just (xr, yr) - go ([], _) (_, _) = Nothing - go (_, _) ([], _) = Nothing - go (_:xs, xr) (_:ys, yr) = go (xs, xr) (ys, yr) + mOverlap (MultiPiece _:_, xr) (_, yr) = Just (xr, yr) + mOverlap (_, xr) (MultiPiece _:_, yr) = Just (xr, yr) + mOverlap ([], xr) ([], yr) = Just (xr, yr) + mOverlap ([], _) (_, _) = Nothing + mOverlap (_, _) ([], _) = Nothing + mOverlap (_:xs, xr) (_:ys, yr) = mOverlap (xs, xr) (ys, yr)