bind-marshal-0.1: src/Bind/Marshal/DataModel.hs
-- Copyright : (C) 2009 Corey O'Connor
-- License : BSD-style (see the file LICENSE)
{-# LANGUAGE EmptyDataDecls #-}
{- Type and value representation of a data model.
-
- The type level data model is refered to by tModel in type level equations.
-}
module Bind.Marshal.DataModel ( module Bind.Marshal.DataModel
, module Bind.Marshal.DataModel.Base
)
where
import Bind.Marshal.Prelude
import Bind.Marshal.DataModel.Base
import Data.List ( length )
import qualified Control.Monad as Monad
-- The data model of an expression is a static description of the memory structure required by the
-- expression. The structure is described by a sequence of actions that depend on a linear
-- memory region.
--
-- Type level representation of a data model.
-- A "data model" is a sequence of buffer-static actions.
-- A buffer-static action is an action that operates on a memory region of a statically known size.
--
-- The sequence of buffer-static actions is statically defined by:
-- containing a dynamically repeated term.
-- containing a statically repeated term
--
-- A term may be a buffer-static action.
-- - If a dyn action is replicated then the result is also a dynamic action.
{- Value level representation of a data model. This is used for dynamic introspection. Currently the
- data model is a record of all data model influencing actions contained in the action monad.
-}
data DynamicModel = DynamicModel
{ action_seq :: ActionSeq
}
data ActionSeq -- XXX
-- Current descriptions of the memory regions that compose a data model:
-- - deserialization of a type with a constant marshalled size
-- - serialization of a type with a constant marshalled size
data ActionDesc
= DesAction Size
| SerAction Size
-- Complete model representation. Contains both the value level and type level representations.
data Model tModel = Model
{ dynamic_model :: DynamicModel
}
-- The constraint IsStaticModel verifies the deserialization scheme of apply_des_to_fixed_buffer is
-- applicable. The scheme assumes two things:
-- 1. The buffer is large enough to support all the deserialization actions performed in "action"
-- 2. The action's deserialization actions are statically fixed.
--
-- H: It is sufficient to match against the head of the serialization sequence. The rest of the
-- serialization sequence is already assured to be static iff the head is static due to the rules of
-- the DMApp equation.
--
-- XXX: Verify this constraint fails when applied to a dynamic buffer sequence.
--
type family IsStaticModel model
type instance IsStaticModel (StaticModel size) = True