{-# LANGUAGE OverloadedStrings #-}

module Network.Miku.Utils where

import Control.Lens ((#), (&))
import Control.Monad.State
import Data.Bifunctor (first)
import Data.ByteString.Char8 (ByteString)
import Data.Monoid ((<>))
import Hack2
import Prelude hiding ((-))
import qualified Data.ByteString.Char8 as B

infixr 0 -
{-# INLINE (-) #-}
(-) :: (a -> b) -> a -> b
f - x = f x

namespace :: ByteString -> Env -> [(ByteString, ByteString)]
namespace x =
      map (first (B.drop (B.length x)))
    . filter ((x `B.isPrefixOf`) . fst)
    . hackHeaders

put_namespace :: ByteString -> [(ByteString, ByteString)] -> Env -> Env
put_namespace x xs env =
  let adds             = map (first (x <>)) xs
      new_headers      = map fst adds
      new_hack_headers =
        (hackHeaders env & filter (flip notElem new_headers . fst))
        <> adds

  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 = modify