respond-0.2.0.0: src/Web/Respond/Types/Path.hs
{-|
Description: path consumer
tools for consuming request path
-}
{-# LANGUAGE TemplateHaskell #-}
module Web.Respond.Types.Path where
import qualified Data.Text as T
import Control.Monad.Trans.State
import qualified Data.Sequence as S
import Data.Foldable (toList)
import Data.Monoid ((<>))
import Control.Lens (makeLenses, snoc, (%=), uses)
import Safe (headMay, tailSafe)
-- * working with the path.
-- | stores the path and how much of it has been consumed
data PathConsumer = PathConsumer {
-- | the consumed part of the path.
_pcConsumed :: S.Seq T.Text,
-- | the unconsumed part
_pcUnconsumed :: [T.Text]
} deriving (Eq, Show)
makeLenses ''PathConsumer
-- | build a path consumer starting with nothing consumed
mkPathConsumer :: [T.Text] -> PathConsumer
mkPathConsumer = PathConsumer S.empty
-- | get the next path element
pcGetNext :: PathConsumer -> Maybe T.Text
pcGetNext = headMay . _pcUnconsumed
-- | move forward in the path
pcConsumeNext :: PathConsumer -> PathConsumer
pcConsumeNext = execState $ do
next <- uses pcUnconsumed headMay
pcConsumed %= maybe id (flip snoc) next
pcUnconsumed %= tailSafe
getFullPath :: PathConsumer -> [T.Text]
getFullPath pc = toList (_pcConsumed pc) <> _pcUnconsumed pc