module Network.Loli.Utils where import Control.Monad.State import Hack import MPS.Light import Prelude hiding ((.), (/), (>), (^), (-)) import Data.ByteString.UTF8 (fromString, toString) namespace :: String -> Env -> [(String, String)] namespace x env = env .hackCache .map_fst toString .map_snd toString .select (fst > starts_with x) .map_fst (drop (x.length)) put_namespace :: String -> [(String, String)] -> Env -> Env put_namespace x xs env = let adds = xs.map_fst (x ++) .map_fst fromString .map_snd fromString new_headers = adds.map fst new_hack_headers = env.hackCache.reject (fst > belongs_to new_headers) ++ adds in env {hackCache = new_hack_headers} set_namespace :: String -> String -> String -> Env -> Env set_namespace x k v = put_namespace x [(k,v)] delete_namespace :: String -> String -> Env -> Env delete_namespace x k env = let new_hack_headers = env.hackCache.reject (fst > is (fromString (x ++ k))) in env {hackCache = new_hack_headers} insert_last :: a -> [a] -> [a] insert_last x xs = xs ++ [x] update :: (MonadState a m, Functor m) => (a -> a) -> m () update f = get ^ f >>= put