packages feed

semi-iso-1.0.0.0: Control/Category/Reader.hs

{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeFamilies #-}
{- |
Module      :  Control.Category.Reader
Description :  Reader category transformer.
Copyright   :  (c) Paweł Nowak
License     :  MIT

Maintainer  :  Paweł Nowak <pawel834@gmail.com>
Stability   :  experimental

Provides a Reader category transformer.
-}
module Control.Category.Reader (
    ReaderCT(..)
    ) where

import Control.Category
import Control.Category.Structures
import Control.Lens.Iso
import Control.Lens.SemiIso
import Control.SIArrow
import Prelude hiding (id, (.))

newtype ReaderCT env cat a b = ReaderCT { runReaderCT :: env -> cat a b }

instance CatTrans (ReaderCT env) where
    clift = ReaderCT . const

instance Category cat => Category (ReaderCT env cat) where
    id = clift id
    ReaderCT f . ReaderCT g = ReaderCT $ \x -> f x . g x

instance Products cat => Products (ReaderCT env cat) where
    ReaderCT f *** ReaderCT g = ReaderCT $ \x -> f x *** g x

instance Coproducts cat => Coproducts (ReaderCT env cat) where
    ReaderCT f +++ ReaderCT g = ReaderCT $ \x -> f x +++ g x

instance CatPlus cat => CatPlus (ReaderCT env cat) where
    cempty = clift cempty
    ReaderCT f /+/ ReaderCT g = ReaderCT $ \x -> f x /+/ g x

instance SIArrow cat => SIArrow (ReaderCT env cat) where
    siarr = clift . siarr
    sibind ai = ReaderCT $ \env -> sibind
        (iso id (flip runReaderCT env) . cloneSemiIso ai . iso (flip runReaderCT env) id)