{-# LANGUAGE KindSignatures #-}
{-# OPTIONS_GHC -Wall -fno-warn-tabs #-}

module Control.Monad.Freer.Par.Funable (
	-- ** Funable
	Funable(..),
	-- ** Taggable
	Taggable(..), Tag(..), sameTag, Id ) where

import Control.Monad.Freer.Par.Internal.Id (Id)

---------------------------------------------------------------------------

class Funable f where
	fun :: (a -> m b) -> f m a b
	($$) :: Applicative m => f m a b -> a -> m b

class Taggable (t :: (* -> *) -> * -> * -> *) where
	getTag :: t m a b -> Tag; putTag :: t m a b -> Id -> t m a b

data Tag = NoTag | Tag Id deriving Int -> Tag -> ShowS
[Tag] -> ShowS
Tag -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Tag] -> ShowS
$cshowList :: [Tag] -> ShowS
show :: Tag -> String
$cshow :: Tag -> String
showsPrec :: Int -> Tag -> ShowS
$cshowsPrec :: Int -> Tag -> ShowS
Show

sameTag :: Tag -> Tag -> Bool
Tag
l sameTag :: Tag -> Tag -> Bool
`sameTag` Tag
r | Tag Id
i <- Tag
l, Tag Id
j <- Tag
r = Id
i forall a. Eq a => a -> a -> Bool
== Id
j | Bool
otherwise = Bool
False