packages feed

hsenv-0.3: src/Util/StaticArrowT.hs

module Util.StaticArrowT ( StaticArrowT(..)
                         , addStatic
                         , getStatic
                         ) where

import Data.Monoid (Monoid(..))
import Control.Arrow (Arrow(..), ArrowChoice(..))
import qualified Control.Category as C

-- arrow transformer, that adds static information
-- to underlying computation
data StaticArrowT m arr a b = StaticArrowT m (arr a b)

instance (C.Category arr, Monoid m) => C.Category (StaticArrowT m arr) where
  id = StaticArrowT mempty C.id
  StaticArrowT m2 arr2 . StaticArrowT m1 arr1 =
      StaticArrowT (m2 `mappend` m1) $ arr2 C.. arr1

instance (Arrow arr, Monoid m) => Arrow (StaticArrowT m arr) where
  arr f = StaticArrowT mempty $ arr f
  first (StaticArrowT m arrow) = StaticArrowT m $ first arrow

instance (ArrowChoice arr, Monoid m) => ArrowChoice (StaticArrowT m arr) where
    left (StaticArrowT m arrow) = StaticArrowT m $ left arrow

-- simplest computation with specified static information
addStatic :: (Monoid m, Arrow arr) => m -> StaticArrowT m arr a a
addStatic m = StaticArrowT m C.id

-- returns static information from the whole computation
-- (without running it)
getStatic :: (Monoid m, Arrow arr) => StaticArrowT m arr a b -> m
getStatic (StaticArrowT m _) = m