packages feed

stc-lang-1.0.0: src/Data/StateElement.hs

{-# LANGUAGE InstanceSigs #-}

module Data.StateElement where

import Data.Dynamic2

import Control.DeepSeq

--
-- Support for heterogeneous lists.
--
data S =
    forall a. Typeable a =>
              S (a -> ())
                Dynamic

toS :: forall a. (Typeable a, NFData a)
    => a
    -> S
toS a = S rnf' (toDyn a)
  where
    rnf' :: a -> ()
    rnf' = rnf

fromS :: Typeable a => S -> a
fromS (S _ a) = forceDynamic a

instance NFData S where
    rnf :: S -> ()
    rnf (S toRnf d) = toRnf $ forceDynamic d