X-Git-Url: http://git.cielonegro.org/gitweb.cgi?p=Lucu.git;a=blobdiff_plain;f=Network%2FHTTP%2FLucu%2FDispatcher%2FInternal.hs;h=f86eb1f4dacecf75bc5ef663e217b7828d208481;hp=71e5ffd211659b6af3dc8019b6db3f92e3c17eea;hb=761b90ab4f413d2e83460f170082f3b15bbaef4f;hpb=dc20568c7c323ea2193326aab48f236fa3817191 diff --git a/Network/HTTP/Lucu/Dispatcher/Internal.hs b/Network/HTTP/Lucu/Dispatcher/Internal.hs index 71e5ffd..f86eb1f 100644 --- a/Network/HTTP/Lucu/Dispatcher/Internal.hs +++ b/Network/HTTP/Lucu/Dispatcher/Internal.hs @@ -2,10 +2,12 @@ DoAndIfThenElse , ExistentialQuantification , FlexibleInstances + , GeneralizedNewtypeDeriving , OverlappingInstances , MultiParamTypeClasses , RecordWildCards , ScopedTypeVariables + , TemplateHaskell , UndecidableInstances , UnicodeSyntax #-} @@ -17,7 +19,6 @@ module Network.HTTP.Lucu.Dispatcher.Internal , ResourceMapper(..) , ResourceMap , ResourceTree - , ResourceNode , dispatch ) @@ -26,13 +27,14 @@ import Control.Applicative hiding (empty) import Control.Monad.Trans.Maybe import Control.Monad.Unicode import Data.Collections -import qualified Data.Map as M +import qualified Data.Collections.Newtype.TH as C import Data.Monoid import Data.Monoid.Unicode +import Network.HTTP.Lucu.Dispatcher.Node import Network.HTTP.Lucu.Resource.Internal import Network.HTTP.Lucu.Utils import Network.URI hiding (path) -import Prelude hiding (filter, lookup, null) +import Prelude hiding (lookup) import Prelude.Unicode -- |FIXME: docs @@ -73,15 +75,7 @@ data ResourceMap = ∀α. ResourceMapper α ⇒ RMap α -- FIXME: doc newtype ResourceTree = Root ResourceNode - --- FIXME: docs -data ResourceNode - = Greedy !Resource - | NonGreedy !Resource !SubTree - | Branch !SubTree - -type SubTree - = M.Map PathSegment ResourceNode + deriving (Monoid, Show) -- Instances of SchemeMapper -------------------------------------------------- instance SchemeMapper SchemeMap where @@ -242,50 +236,8 @@ instance ResourceMapper (PathSegments → Maybe (PathSegments, Resource)) where findResource = (maybe (fail (⊥)) return ∘) ∘ flip id -- Instances of ResourceTree -------------------------------------------------- -instance Unfoldable ResourceTree (PathSegments, ResourceNode) where - {-# INLINE insert #-} - insert e (Root root) = Root $ insert e root - {-# INLINE empty #-} - empty = (∅) - -instance Monoid ResourceTree where - {-# INLINE mempty #-} - mempty = Root (∅) - {-# INLINE mappend #-} - mappend (Root a) (Root b) - = Root (a ⊕ b) - --- Instances of ResourceNode -------------------------------------------------- -instance Unfoldable ResourceNode (PathSegments, ResourceNode) where - {-# INLINEABLE insert #-} - insert (p, n) = insertNodeAt (canonPath p) n - {-# INLINE empty #-} - empty = Branch (∅) - -canonPath ∷ (Collection c f, Foldable f e) ⇒ c → c -{-# INLINEABLE canonPath #-} -canonPath = filter ((¬) ∘ null) - -insertNodeAt ∷ PathSegments → ResourceNode → ResourceNode → ResourceNode -{-# INLINEABLE insertNodeAt #-} -insertNodeAt p a b - = case front p of - Nothing → a ⊕ b - Just (x, xs) - | null xs → Branch (singleton (x, a)) ⊕ b - | otherwise → insertNodeAt xs a (∅) ⊕ b - -instance Monoid ResourceNode where - {-# INLINE mempty #-} - mempty = Branch (∅) - {-# INLINEABLE mappend #-} - mappend _ (Greedy r ) = Greedy r - mappend (Greedy _ ) (NonGreedy r n) = NonGreedy r n - mappend (NonGreedy _ m) (NonGreedy r n) = NonGreedy r (m ⊕ n) - mappend (Branch m) (NonGreedy r n) = NonGreedy r (m ⊕ n) - mappend (Greedy r ) (Branch _) = Greedy r - mappend (NonGreedy r m) (Branch n) = NonGreedy r (m ⊕ n) - mappend (Branch m) (Branch n) = Branch (m ⊕ n) +C.derive [d| instance Foldable ResourceTree (PathSegments, ResourceNode) + |] -- dispatch ------------------------------------------------------------------- dispatch ∷ SchemeMapper α ⇒ URI → α → MaybeT IO (PathSegments, Resource)