module System.Shana.Type where

import Control.Arrow
import Control.Category
import Prelude hiding ((.), id)
import Control.Monad ((>=>))

newtype Shana a b = Shana { runShana :: a -> IO [b] }


instance Category Shana where
  id = Shana $ return . return
  Shana g . Shana f = Shana $ f >=> mapM g >=> return . concat


instance Arrow Shana where
  arr f = Shana $ return . return . f

  first (Shana f) = Shana $ \(x, y) -> do
    xs <- f x
    return $ zip xs (repeat y)