{-# LANGUAGE ExistentialQuantification #-}

module Control.Concurrent.Chan.ReadOnly
  ( ReadOnlyChan
  , toReadOnlyChan
  ) where

import Control.Concurrent.Chan (Chan)
import Control.Concurrent.Chan.Class

data ReadOnlyChan b = forall a . ReadOnlyChan (Chan a) (a -> b)

instance Functor ReadOnlyChan where
  fmap f (ReadOnlyChan c f') = ReadOnlyChan c (f . f')

toReadOnlyChan :: Chan a -> ReadOnlyChan a
toReadOnlyChan c = ReadOnlyChan c id

instance ChanDup ReadOnlyChan where
    dupChan (ReadOnlyChan chan f) = do
      chan' <- dupChan chan
      return (ReadOnlyChan chan' f)
    {-# INLINE dupChan #-}

instance ChanRead ReadOnlyChan where
    readChan (ReadOnlyChan chan f) = f <$> readChan chan
    {-# INLINE readChan #-}