nested-routes 0.0.2 → 0.0.3.1
raw patch · 3 files changed
+34/−17 lines, 3 filesdep ~pseudo-triePVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: pseudo-trie
API changes (from Hackage documentation)
- Web.Routes.Nested.FileExtListener: FileExtListenerT :: WriterT (FileExts r) m a -> FileExtListenerT r m a
- Web.Routes.Nested.FileExtListener: FileExts :: Map FileExt a -> FileExts a
- Web.Routes.Nested.FileExtListener: Html :: FileExt
- Web.Routes.Nested.FileExtListener: Json :: FileExt
- Web.Routes.Nested.FileExtListener: Text :: FileExt
- Web.Routes.Nested.FileExtListener: runFileExtListenerT :: FileExtListenerT r m a -> WriterT (FileExts r) m a
- Web.Routes.Nested.FileExtListener: unFileExts :: FileExts a -> Map FileExt a
- Web.Routes.Nested.VerbListener: Delete :: Verb
- Web.Routes.Nested.VerbListener: Get :: Verb
- Web.Routes.Nested.VerbListener: Post :: Verb
- Web.Routes.Nested.VerbListener: Put :: Verb
- Web.Routes.Nested.VerbListener: VerbListenerT :: WriterT (Verbs z r) m a -> VerbListenerT z r m a
- Web.Routes.Nested.VerbListener: Verbs :: Map Verb (Maybe (ReqBodyT z), FileExts a) -> Verbs z a
- Web.Routes.Nested.VerbListener: instance Foldable (Verbs z)
- Web.Routes.Nested.VerbListener: instance Functor (Verbs z)
- Web.Routes.Nested.VerbListener: instance Monoid (Verbs z a)
- Web.Routes.Nested.VerbListener: instance Traversable (Verbs z)
- Web.Routes.Nested.VerbListener: runVerbListenerT :: VerbListenerT z r m a -> WriterT (Verbs z r) m a
- Web.Routes.Nested.VerbListener: type ReqBodyT z = ByteString -> z
- Web.Routes.Nested.VerbListener: unVerbs :: Verbs z a -> Map Verb (Maybe (ReqBodyT z), FileExts a)
+ Web.Routes.Nested.FileExtListener: [FileExtListenerT] :: WriterT (FileExts r) m a -> FileExtListenerT r m a
+ Web.Routes.Nested.FileExtListener: [FileExts] :: Map FileExt a -> FileExts a
+ Web.Routes.Nested.FileExtListener: [Html] :: FileExt
+ Web.Routes.Nested.FileExtListener: [Json] :: FileExt
+ Web.Routes.Nested.FileExtListener: [Text] :: FileExt
+ Web.Routes.Nested.FileExtListener: [runFileExtListenerT] :: FileExtListenerT r m a -> WriterT (FileExts r) m a
+ Web.Routes.Nested.FileExtListener: [unFileExts] :: FileExts a -> Map FileExt a
+ Web.Routes.Nested.VerbListener: [Delete] :: Verb
+ Web.Routes.Nested.VerbListener: [Get] :: Verb
+ Web.Routes.Nested.VerbListener: [Post] :: Verb
+ Web.Routes.Nested.VerbListener: [Put] :: Verb
+ Web.Routes.Nested.VerbListener: [VerbListenerT] :: WriterT (Verbs z m r) m a -> VerbListenerT z r m a
+ Web.Routes.Nested.VerbListener: [Verbs] :: Map Verb (Maybe (ReaderT ByteString m z), FileExts r) -> Verbs z m r
+ Web.Routes.Nested.VerbListener: [runVerbListenerT] :: VerbListenerT z r m a -> WriterT (Verbs z m r) m a
+ Web.Routes.Nested.VerbListener: [unVerbs] :: Verbs z m r -> Map Verb (Maybe (ReaderT ByteString m z), FileExts r)
+ Web.Routes.Nested.VerbListener: instance Foldable (Verbs z m)
+ Web.Routes.Nested.VerbListener: instance Functor (Verbs z m)
+ Web.Routes.Nested.VerbListener: instance Monoid (Verbs z m a)
+ Web.Routes.Nested.VerbListener: instance Traversable (Verbs z m)
- Web.Routes.Nested: handle :: Monad m => [Text] -> VerbListenerT z Response m () -> HandlerT z m ()
+ Web.Routes.Nested: handle :: Monad m => [Text] -> VerbListenerT z Response m () -> [HandlerT z m ()] -> HandlerT z m ()
- Web.Routes.Nested: route :: (Functor m, Monad m, MonadIO m) => HandlerT z m a -> Request -> (Response -> m b) -> m b
+ Web.Routes.Nested: route :: (Functor m, Monad m, MonadIO m) => Response -> HandlerT z m a -> Request -> (Response -> m b) -> m b
- Web.Routes.Nested.FileExtListener: blaze :: Monad m => Html -> FileExtListenerT Response m ()
+ Web.Routes.Nested.FileExtListener: blaze :: (Monad m) => Html -> FileExtListenerT Response m ()
- Web.Routes.Nested.FileExtListener: builder :: Monad m => Builder -> RequestHeaders -> FileExt -> FileExtListenerT Response m ()
+ Web.Routes.Nested.FileExtListener: builder :: (Monad m) => Builder -> RequestHeaders -> FileExt -> FileExtListenerT Response m ()
- Web.Routes.Nested.FileExtListener: bytestring :: Monad m => ByteString -> RequestHeaders -> FileExt -> FileExtListenerT Response m ()
+ Web.Routes.Nested.FileExtListener: bytestring :: (Monad m) => ByteString -> RequestHeaders -> FileExt -> FileExtListenerT Response m ()
- Web.Routes.Nested.FileExtListener: lucid :: Monad m => HtmlT m () -> FileExtListenerT Response m ()
+ Web.Routes.Nested.FileExtListener: lucid :: (Monad m) => HtmlT m () -> FileExtListenerT Response m ()
- Web.Routes.Nested.FileExtListener: text :: Monad m => Text -> FileExtListenerT Response m ()
+ Web.Routes.Nested.FileExtListener: text :: (Monad m) => Text -> FileExtListenerT Response m ()
- Web.Routes.Nested.VerbListener: delete :: Monad m => FileExtListenerT Response m a -> VerbListenerT z Response m ()
+ Web.Routes.Nested.VerbListener: delete :: (Monad m) => FileExtListenerT Response m a -> VerbListenerT z Response m ()
- Web.Routes.Nested.VerbListener: get :: Monad m => FileExtListenerT Response m a -> VerbListenerT z Response m ()
+ Web.Routes.Nested.VerbListener: get :: (Monad m) => FileExtListenerT Response m a -> VerbListenerT z Response m ()
- Web.Routes.Nested.VerbListener: newtype Verbs z a
+ Web.Routes.Nested.VerbListener: newtype Verbs z m r
- Web.Routes.Nested.VerbListener: post :: (Monad m, MonadIO m) => (ByteString -> z) -> FileExtListenerT Response m a -> VerbListenerT z Response m ()
+ Web.Routes.Nested.VerbListener: post :: (Monad m, MonadIO m) => (ByteString -> m z) -> FileExtListenerT Response m a -> VerbListenerT z Response m ()
- Web.Routes.Nested.VerbListener: put :: (Monad m, MonadIO m) => (ByteString -> z) -> FileExtListenerT Response m a -> VerbListenerT z Response m ()
+ Web.Routes.Nested.VerbListener: put :: (Monad m, MonadIO m) => (ByteString -> m z) -> FileExtListenerT Response m a -> VerbListenerT z Response m ()
Files
- nested-routes.cabal +2/−2
- src/Web/Routes/Nested.hs +20/−4
- src/Web/Routes/Nested/VerbListener.hs +12/−11
nested-routes.cabal view
@@ -1,5 +1,5 @@ Name: nested-routes-Version: 0.0.2+Version: 0.0.3.1 Author: Athan Clark <athan.clark@gmail.com> Maintainer: Athan Clark <athan.clark@gmail.com> License: BSD3@@ -24,7 +24,7 @@ , transformers , semigroups , containers- , pseudo-trie >= 0.0.4+ , pseudo-trie >= 0.0.4.2 , text , aeson , blaze-html
src/Web/Routes/Nested.hs view
@@ -25,38 +25,54 @@ import Control.Monad.IO.Class import Control.Monad.Trans import Control.Monad.Writer+import Control.Monad.Reader import qualified Data.List.NonEmpty as NE import Data.Monoid import Data.Trie.Pseudo+import qualified Data.Trie.Pseudo as P import Data.Trie.Rooted import qualified Data.Trie.Rooted as R import Data.Traversable import qualified Data.Text as T import qualified Data.Map.Lazy as M+import qualified Data.ByteString.Lazy as BL newtype HandlerT z m a = HandlerT- { runHandler :: WriterT (MergeRooted T.Text (Verbs z Response)) m a }+ { runHandler :: WriterT (MergeRooted T.Text (Verbs z m Response)) m a } deriving (Functor) deriving instance Applicative m => Applicative (HandlerT z m) deriving instance Monad m => Monad (HandlerT z m) deriving instance MonadIO m => MonadIO (HandlerT z m)-deriving instance MonadTrans (HandlerT z)+instance MonadTrans (HandlerT z) where+ lift ma = HandlerT $ lift ma handle :: Monad m => [T.Text] -> VerbListenerT z Response m ()+ -> [HandlerT z m ()] -> HandlerT z m ()-handle ts vl = do+handle ts vl [] = do vfrs <- lift $ execWriterT $ runVerbListenerT vl HandlerT $ tell $ case ts of [] -> MergeRooted $ Rooted (Just vfrs) [] _ -> MergeRooted $ Rooted Nothing [Rest (NE.fromList ts) vfrs]+handle ts vl cs = do+ vfrs <- lift $ execWriterT $ runVerbListenerT vl+ child <- lift $ foldM (\acc c -> (acc <>) <$> (execWriterT $ runHandler c)) mempty cs + HandlerT $ tell $+ case ts of+ [] -> case unMergeRooted child of+ Rooted _ xs -> MergeRooted $ Rooted (Just vfrs) xs+ _ -> let child' = push (unMergeRooted child) $ NE.fromList ts in+ MergeRooted $ Rooted Nothing [P.assign (NE.fromList ts) (Just vfrs) child']++ route :: (Functor m, Monad m, MonadIO m) => HandlerT z m a -> Request -> (Response -> m b) -> m b@@ -78,7 +94,7 @@ Nothing -> respond r Just reqbf -> do body <- liftIO $ strictRequestBody req- return $ reqbf body+ (runReaderT $ reqbf) body respond r Nothing -> respond notFound Nothing -> respond notFound
src/Web/Routes/Nested/VerbListener.hs view
@@ -14,6 +14,7 @@ import Control.Applicative hiding (empty) import Control.Monad.Trans import Control.Monad.Writer+import Control.Monad.Reader import Data.Monoid import Data.Foldable import Data.Traversable@@ -27,22 +28,21 @@ | Delete deriving (Show, Eq, Ord) -type ReqBodyT z = BL.ByteString -> z--newtype Verbs z a = Verbs { unVerbs :: Map Verb (Maybe (ReqBodyT z), FileExts a) }+newtype Verbs z m r = Verbs { unVerbs :: Map Verb (Maybe (ReaderT BL.ByteString m z), FileExts r) } deriving (Functor, Traversable) -deriving instance Monoid (Verbs z a)-deriving instance Foldable (Verbs z)+deriving instance Monoid (Verbs z m a)+deriving instance Foldable (Verbs z m) newtype VerbListenerT z r m a =- VerbListenerT { runVerbListenerT :: WriterT (Verbs z r) m a }+ VerbListenerT { runVerbListenerT :: WriterT (Verbs z m r) m a } deriving (Functor) deriving instance Applicative m => Applicative (VerbListenerT z r m) deriving instance Monad m => Monad (VerbListenerT z r m) deriving instance MonadIO m => MonadIO (VerbListenerT z r m)-deriving instance MonadTrans (VerbListenerT z r)+instance MonadTrans (VerbListenerT z r) where+ lift ma = VerbListenerT $ lift ma get :: (Monad m) =>@@ -56,25 +56,26 @@ post :: (Monad m, MonadIO m) =>- (BL.ByteString -> z)+ (BL.ByteString -> m z) -> FileExtListenerT Response m a -> VerbListenerT z Response m () post handle flistener = do (fileexts :: FileExts Response) <- lift $ execWriterT $ runFileExtListenerT flistener- let new = singleton Post (Just handle, fileexts)+ let new = singleton Post (Just $ ReaderT handle, fileexts) VerbListenerT $ tell $ Verbs new put :: (Monad m, MonadIO m) =>- (BL.ByteString -> z)+ (BL.ByteString -> m z) -> FileExtListenerT Response m a -> VerbListenerT z Response m () put handle flistener = do (fileexts :: FileExts Response) <- lift $ execWriterT $ runFileExtListenerT flistener- let new = singleton Put (Just handle, fileexts)+ let new = singleton Put (Just $ ReaderT handle, fileexts) VerbListenerT $ tell $ Verbs new+ delete :: (Monad m) => FileExtListenerT Response m a