module OpenTelemetry.Context.Types where import Data.Text (Text) import qualified Data.Vault.Strict as V -- | A `Context` is a propagation mechanism which carries execution-scoped values -- across API boundaries and between logically associated execution units. -- Cross-cutting concerns access their data in-process using the same shared -- `Context` object newtype Context = Context V.Vault instance Semigroup Context where <> :: Context -> Context -> Context (<>) (Context Vault l) (Context Vault r) = Vault -> Context Context (Vault -> Vault -> Vault V.union Vault l Vault r) instance Monoid Context where mempty :: Context mempty = Vault -> Context Context Vault V.empty -- | Keys are used to allow cross-cutting concerns to control access to their local state. -- They are unique such that other libraries which may use the same context -- cannot accidentally use the same key. It is recommended that concerns mediate -- data access via an API, rather than provide direct public access to their keys. data Key a = Key { Key a -> Text keyName :: Text, Key a -> Key a key :: V.Key a }