MetaObject-0.0.1: src/MO/Capture.hs
{-# OPTIONS_GHC -fglasgow-exts -fparr #-}
module MO.Capture where
import GHC.PArr
import Data.Typeable
import StringTable.Atom
import StringTable.AtomMap as AtomMap
import Data.Monoid
-- | a Capture is a frozen version of the arguments to an application.
data Capt a
= CaptMeth
{ c_invocant :: a
, c_feeds :: [:Feed a:]
}
| CaptSub
{ c_feeds :: [:Feed a:]
}
deriving (Show, Eq, Ord, Typeable)
-- | non-invocant arguments.
data Feed a = MkFeed
{ f_positionals :: [: a :]
, f_nameds :: AtomMap [: a :]
-- ^ maps to [:a:] and not a since if the Sig stipulates
-- @x, "x => 1, x => 2" constructs @x = (1, 2).
}
deriving (Show, Eq, Ord, Typeable)
instance Monoid [: a :] where
mempty = [: :]
mappend = (+:+)
instance Monoid (Feed a) where
mempty = MkFeed mempty mempty
mappend (MkFeed x1 x2) (MkFeed y1 y2) = MkFeed (mappend x1 y1) (mappend x2 y2)
mconcat xs = MkFeed (mconcat (map f_positionals xs)) (mconcat (map f_nameds xs))
emptyFeed :: Feed a
emptyFeed = mempty
concatFeeds :: [: Feed a :] -> Feed a
concatFeeds xs = MkFeed (concatMapP f_positionals xs) (foldlP AtomMap.union mempty (mapP f_nameds xs))