{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE DeriveFunctor #-}
module Morte.Context (
Context
, empty
, insert
, lookup
, toList
) where
import Control.DeepSeq (NFData)
import Data.Text.Lazy (Text)
import Prelude hiding (lookup)
newtype Context a = Context { getContext :: [(Text, a)] }
deriving (Functor, NFData)
empty :: Context a
empty = Context []
insert :: Text -> a -> Context a -> Context a
insert k v (Context kvs) = Context ((k, v) : kvs)
{-# INLINABLE insert #-}
lookup :: Text -> Int -> Context a -> Maybe a
lookup k n0 (Context kvs0) = loop kvs0 n0
where
loop ((k', v):kvs) n | k /= k' = loop kvs n
| n > 0 = loop kvs $! n - 1
| n == 0 = Just v
| otherwise = Nothing
loop [] _ = Nothing
{-# INLINABLE lookup #-}
toList :: Context a -> [(Text, a)]
toList = getContext
{-# INLINABLE toList #-}