{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE Safe #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE RankNTypes #-}

{-|
Module:      Control.Object
Copyright:   (C) 2015 The University of Kansas
License:     BSD-style (see the file LICENSE)
Maintainer:  Andy Gill
Stability:   Experimental

An Object type, which is a natural transformation into the 'IO' monad.
-}

module Control.Object (Object(..), (#)) where

import Control.Natural

-- | An 'Object' is a natural transformation from a given 'Functor' 'f', to 'IO'.
newtype Object f = Object (f ~> IO)

instance Transformation f IO (Object f) where
    Object f # g = NT f # g