packages feed

miku-2011.6.11: src/Network/Miku/Utils.hs

{-# LANGUAGE OverloadedStrings #-}

module Network.Miku.Utils where

import Control.Monad.State
import Hack2
import Air.Env
import Prelude ()
import Data.ByteString.UTF8 (fromString, toString)

import qualified Data.ByteString.Lazy.Char8 as B
import Data.ByteString.Lazy.Char8 (ByteString)

namespace :: ByteString -> Env -> [(ByteString, ByteString)]
namespace x env =
  env
    .hackHeaders
    .select (fst > (x `B.isPrefixOf`))
    .map_fst (B.drop (x.B.length))

put_namespace :: ByteString -> [(ByteString, ByteString)] -> Env -> Env
put_namespace x xs env = 
  let adds             = xs.map_fst (x +)
      new_headers      = adds.map fst
      new_hack_headers = 
        env.hackHeaders.reject (fst > belongs_to new_headers) ++ adds
  in
  env {hackHeaders = new_hack_headers}


set_namespace :: ByteString -> ByteString -> ByteString -> Env -> Env
set_namespace x k v = put_namespace x [(k,v)]

delete_namespace :: ByteString -> ByteString -> Env -> Env
delete_namespace x k env = 
  let new_hack_headers = env.hackHeaders.reject (fst > is (x + k))
  in
  env {hackHeaders = 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