module Web.BowerJson.Utils where
import Control.Applicative
import Control.Monad
import Control.Category ((>>>))
import Data.List (stripPrefix)
import Data.Map (Map)
import qualified Data.Map as M
import Data.Traversable (traverse)
import Data.Aeson
import qualified Data.Aeson.Types as Aeson
headMay :: [a] -> Maybe a
headMay [] = Nothing
headMay (x:_) = Just x
lastMay :: [a] -> Maybe a
lastMay [] = Nothing
lastMay [x] = Just x
lastMay (_:xs) = lastMay xs
parseWithArbitraryKeys :: (Ord a, FromJSON v) =>
(String -> Aeson.Parser a) -> Value -> Aeson.Parser (Map a v)
parseWithArbitraryKeys parseKey v' = do
list <- M.toList <$> parseJSON v'
list' <- traverse (\(k, v) -> (,v) <$> parseKey k) list
return (M.fromList list')
takeDelim :: String -> String -> [String] -> (Maybe String, [String])
takeDelim start end = foldr go (Nothing, [])
where
go str (Just x, strs) =
(Just x, str : strs)
go str (Nothing, strs) =
case stripWrapper start end str of
Just str' -> (Just str', strs)
Nothing -> (Nothing, str : strs)
stripWrapper :: String -> String -> String -> Maybe String
stripWrapper start end =
stripPrefix start
>>> fmap reverse
>=> stripPrefix (reverse end)
>>> fmap reverse