{-# LANGUAGE PatternSynonyms #-}

-- This Source Code Form is subject to the terms of the Mozilla Public
-- License, v. 2.0. If a copy of the MPL was not distributed with this
-- file, You can obtain one at https://mozilla.org/MPL/2.0/.

{- |
Copyright   :  (c) 2023-2024 Yamada Ryo
License     :  MPL-2.0 (see the file LICENSE)
Maintainer  :  ymdfield@outlook.jp
Stability   :  experimental
Portability :  portable
-}
module Data.Effect.Tag where

import Data.Comp.Multi.HFunctor (HFunctor)
import Data.Effect (InsClass, SigClass)

-- | Tagged /instruction class/.
newtype Tag (ins :: InsClass) tag a = Tag {forall {k} (ins :: InsClass) (tag :: k) a. Tag ins tag a -> ins a
unTag :: ins a}
    deriving stock (forall a b. a -> Tag ins tag b -> Tag ins tag a
forall a b. (a -> b) -> Tag ins tag a -> Tag ins tag b
forall (f :: InsClass).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
forall (ins :: InsClass) k (tag :: k) a b.
Functor ins =>
a -> Tag ins tag b -> Tag ins tag a
forall (ins :: InsClass) k (tag :: k) a b.
Functor ins =>
(a -> b) -> Tag ins tag a -> Tag ins tag b
<$ :: forall a b. a -> Tag ins tag b -> Tag ins tag a
$c<$ :: forall (ins :: InsClass) k (tag :: k) a b.
Functor ins =>
a -> Tag ins tag b -> Tag ins tag a
fmap :: forall a b. (a -> b) -> Tag ins tag a -> Tag ins tag b
$cfmap :: forall (ins :: InsClass) k (tag :: k) a b.
Functor ins =>
(a -> b) -> Tag ins tag a -> Tag ins tag b
Functor, forall a. Tag ins tag a -> Bool
forall m a. Monoid m => (a -> m) -> Tag ins tag a -> m
forall a b. (a -> b -> b) -> b -> Tag ins tag a -> b
forall (t :: InsClass).
(forall m. Monoid m => t m -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. t a -> [a])
-> (forall a. t a -> Bool)
-> (forall a. t a -> Int)
-> (forall a. Eq a => a -> t a -> Bool)
-> (forall a. Ord a => t a -> a)
-> (forall a. Ord a => t a -> a)
-> (forall a. Num a => t a -> a)
-> (forall a. Num a => t a -> a)
-> Foldable t
forall (ins :: InsClass) k (tag :: k) a.
(Foldable ins, Eq a) =>
a -> Tag ins tag a -> Bool
forall (ins :: InsClass) k (tag :: k) a.
(Foldable ins, Num a) =>
Tag ins tag a -> a
forall (ins :: InsClass) k (tag :: k) a.
(Foldable ins, Ord a) =>
Tag ins tag a -> a
forall (ins :: InsClass) k (tag :: k) m.
(Foldable ins, Monoid m) =>
Tag ins tag m -> m
forall (ins :: InsClass) k (tag :: k) a.
Foldable ins =>
Tag ins tag a -> Bool
forall (ins :: InsClass) k (tag :: k) a.
Foldable ins =>
Tag ins tag a -> Int
forall (ins :: InsClass) k (tag :: k) a.
Foldable ins =>
Tag ins tag a -> [a]
forall (ins :: InsClass) k (tag :: k) a.
Foldable ins =>
(a -> a -> a) -> Tag ins tag a -> a
forall (ins :: InsClass) k (tag :: k) m a.
(Foldable ins, Monoid m) =>
(a -> m) -> Tag ins tag a -> m
forall (ins :: InsClass) k (tag :: k) b a.
Foldable ins =>
(b -> a -> b) -> b -> Tag ins tag a -> b
forall (ins :: InsClass) k (tag :: k) a b.
Foldable ins =>
(a -> b -> b) -> b -> Tag ins tag a -> b
product :: forall a. Num a => Tag ins tag a -> a
$cproduct :: forall (ins :: InsClass) k (tag :: k) a.
(Foldable ins, Num a) =>
Tag ins tag a -> a
sum :: forall a. Num a => Tag ins tag a -> a
$csum :: forall (ins :: InsClass) k (tag :: k) a.
(Foldable ins, Num a) =>
Tag ins tag a -> a
minimum :: forall a. Ord a => Tag ins tag a -> a
$cminimum :: forall (ins :: InsClass) k (tag :: k) a.
(Foldable ins, Ord a) =>
Tag ins tag a -> a
maximum :: forall a. Ord a => Tag ins tag a -> a
$cmaximum :: forall (ins :: InsClass) k (tag :: k) a.
(Foldable ins, Ord a) =>
Tag ins tag a -> a
elem :: forall a. Eq a => a -> Tag ins tag a -> Bool
$celem :: forall (ins :: InsClass) k (tag :: k) a.
(Foldable ins, Eq a) =>
a -> Tag ins tag a -> Bool
length :: forall a. Tag ins tag a -> Int
$clength :: forall (ins :: InsClass) k (tag :: k) a.
Foldable ins =>
Tag ins tag a -> Int
null :: forall a. Tag ins tag a -> Bool
$cnull :: forall (ins :: InsClass) k (tag :: k) a.
Foldable ins =>
Tag ins tag a -> Bool
toList :: forall a. Tag ins tag a -> [a]
$ctoList :: forall (ins :: InsClass) k (tag :: k) a.
Foldable ins =>
Tag ins tag a -> [a]
foldl1 :: forall a. (a -> a -> a) -> Tag ins tag a -> a
$cfoldl1 :: forall (ins :: InsClass) k (tag :: k) a.
Foldable ins =>
(a -> a -> a) -> Tag ins tag a -> a
foldr1 :: forall a. (a -> a -> a) -> Tag ins tag a -> a
$cfoldr1 :: forall (ins :: InsClass) k (tag :: k) a.
Foldable ins =>
(a -> a -> a) -> Tag ins tag a -> a
foldl' :: forall b a. (b -> a -> b) -> b -> Tag ins tag a -> b
$cfoldl' :: forall (ins :: InsClass) k (tag :: k) b a.
Foldable ins =>
(b -> a -> b) -> b -> Tag ins tag a -> b
foldl :: forall b a. (b -> a -> b) -> b -> Tag ins tag a -> b
$cfoldl :: forall (ins :: InsClass) k (tag :: k) b a.
Foldable ins =>
(b -> a -> b) -> b -> Tag ins tag a -> b
foldr' :: forall a b. (a -> b -> b) -> b -> Tag ins tag a -> b
$cfoldr' :: forall (ins :: InsClass) k (tag :: k) a b.
Foldable ins =>
(a -> b -> b) -> b -> Tag ins tag a -> b
foldr :: forall a b. (a -> b -> b) -> b -> Tag ins tag a -> b
$cfoldr :: forall (ins :: InsClass) k (tag :: k) a b.
Foldable ins =>
(a -> b -> b) -> b -> Tag ins tag a -> b
foldMap' :: forall m a. Monoid m => (a -> m) -> Tag ins tag a -> m
$cfoldMap' :: forall (ins :: InsClass) k (tag :: k) m a.
(Foldable ins, Monoid m) =>
(a -> m) -> Tag ins tag a -> m
foldMap :: forall m a. Monoid m => (a -> m) -> Tag ins tag a -> m
$cfoldMap :: forall (ins :: InsClass) k (tag :: k) m a.
(Foldable ins, Monoid m) =>
(a -> m) -> Tag ins tag a -> m
fold :: forall m. Monoid m => Tag ins tag m -> m
$cfold :: forall (ins :: InsClass) k (tag :: k) m.
(Foldable ins, Monoid m) =>
Tag ins tag m -> m
Foldable, forall (t :: InsClass).
Functor t
-> Foldable t
-> (forall (f :: InsClass) a b.
    Applicative f =>
    (a -> f b) -> t a -> f (t b))
-> (forall (f :: InsClass) a. Applicative f => t (f a) -> f (t a))
-> (forall (m :: InsClass) a b.
    Monad m =>
    (a -> m b) -> t a -> m (t b))
-> (forall (m :: InsClass) a. Monad m => t (m a) -> m (t a))
-> Traversable t
forall {ins :: InsClass} {k} {tag :: k}.
Traversable ins =>
Functor (Tag ins tag)
forall {ins :: InsClass} {k} {tag :: k}.
Traversable ins =>
Foldable (Tag ins tag)
forall (ins :: InsClass) k (tag :: k) (m :: InsClass) a.
(Traversable ins, Monad m) =>
Tag ins tag (m a) -> m (Tag ins tag a)
forall (ins :: InsClass) k (tag :: k) (f :: InsClass) a.
(Traversable ins, Applicative f) =>
Tag ins tag (f a) -> f (Tag ins tag a)
forall (ins :: InsClass) k (tag :: k) (m :: InsClass) a b.
(Traversable ins, Monad m) =>
(a -> m b) -> Tag ins tag a -> m (Tag ins tag b)
forall (ins :: InsClass) k (tag :: k) (f :: InsClass) a b.
(Traversable ins, Applicative f) =>
(a -> f b) -> Tag ins tag a -> f (Tag ins tag b)
forall (f :: InsClass) a b.
Applicative f =>
(a -> f b) -> Tag ins tag a -> f (Tag ins tag b)
sequence :: forall (m :: InsClass) a.
Monad m =>
Tag ins tag (m a) -> m (Tag ins tag a)
$csequence :: forall (ins :: InsClass) k (tag :: k) (m :: InsClass) a.
(Traversable ins, Monad m) =>
Tag ins tag (m a) -> m (Tag ins tag a)
mapM :: forall (m :: InsClass) a b.
Monad m =>
(a -> m b) -> Tag ins tag a -> m (Tag ins tag b)
$cmapM :: forall (ins :: InsClass) k (tag :: k) (m :: InsClass) a b.
(Traversable ins, Monad m) =>
(a -> m b) -> Tag ins tag a -> m (Tag ins tag b)
sequenceA :: forall (f :: InsClass) a.
Applicative f =>
Tag ins tag (f a) -> f (Tag ins tag a)
$csequenceA :: forall (ins :: InsClass) k (tag :: k) (f :: InsClass) a.
(Traversable ins, Applicative f) =>
Tag ins tag (f a) -> f (Tag ins tag a)
traverse :: forall (f :: InsClass) a b.
Applicative f =>
(a -> f b) -> Tag ins tag a -> f (Tag ins tag b)
$ctraverse :: forall (ins :: InsClass) k (tag :: k) (f :: InsClass) a b.
(Traversable ins, Applicative f) =>
(a -> f b) -> Tag ins tag a -> f (Tag ins tag b)
Traversable)

-- | Tagged /instruction class/.
type (#) = Tag

infixl 8 #

-- | Tagged /instruction class/.
pattern T :: forall tag ins a. ins a -> Tag ins tag a
pattern $bT :: forall {k} (tag :: k) (ins :: InsClass) a. ins a -> Tag ins tag a
$mT :: forall {r} {k} {tag :: k} {ins :: InsClass} {a}.
Tag ins tag a -> (ins a -> r) -> ((# #) -> r) -> r
T e = Tag e

{-# COMPLETE T #-}

-- | Tagged /signature class/.
newtype TagH (sig :: SigClass) tag f a = TagH {forall {k} (sig :: SigClass) (tag :: k) (f :: InsClass) a.
TagH sig tag f a -> sig f a
unTagH :: sig f a}
    deriving stock (forall a b. a -> TagH sig tag f b -> TagH sig tag f a
forall a b. (a -> b) -> TagH sig tag f a -> TagH sig tag f b
forall (f :: InsClass).
(forall a b. (a -> b) -> f a -> f b)
-> (forall a b. a -> f b -> f a) -> Functor f
forall (sig :: SigClass) k (tag :: k) (f :: InsClass) a b.
Functor (sig f) =>
a -> TagH sig tag f b -> TagH sig tag f a
forall (sig :: SigClass) k (tag :: k) (f :: InsClass) a b.
Functor (sig f) =>
(a -> b) -> TagH sig tag f a -> TagH sig tag f b
<$ :: forall a b. a -> TagH sig tag f b -> TagH sig tag f a
$c<$ :: forall (sig :: SigClass) k (tag :: k) (f :: InsClass) a b.
Functor (sig f) =>
a -> TagH sig tag f b -> TagH sig tag f a
fmap :: forall a b. (a -> b) -> TagH sig tag f a -> TagH sig tag f b
$cfmap :: forall (sig :: SigClass) k (tag :: k) (f :: InsClass) a b.
Functor (sig f) =>
(a -> b) -> TagH sig tag f a -> TagH sig tag f b
Functor, forall a. TagH sig tag f a -> Bool
forall m a. Monoid m => (a -> m) -> TagH sig tag f a -> m
forall a b. (a -> b -> b) -> b -> TagH sig tag f a -> b
forall (t :: InsClass).
(forall m. Monoid m => t m -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall m a. Monoid m => (a -> m) -> t a -> m)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall a b. (a -> b -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall b a. (b -> a -> b) -> b -> t a -> b)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. (a -> a -> a) -> t a -> a)
-> (forall a. t a -> [a])
-> (forall a. t a -> Bool)
-> (forall a. t a -> Int)
-> (forall a. Eq a => a -> t a -> Bool)
-> (forall a. Ord a => t a -> a)
-> (forall a. Ord a => t a -> a)
-> (forall a. Num a => t a -> a)
-> (forall a. Num a => t a -> a)
-> Foldable t
forall (sig :: SigClass) k (tag :: k) (f :: InsClass) a.
(Foldable (sig f), Eq a) =>
a -> TagH sig tag f a -> Bool
forall (sig :: SigClass) k (tag :: k) (f :: InsClass) a.
(Foldable (sig f), Num a) =>
TagH sig tag f a -> a
forall (sig :: SigClass) k (tag :: k) (f :: InsClass) a.
(Foldable (sig f), Ord a) =>
TagH sig tag f a -> a
forall (sig :: SigClass) k (tag :: k) (f :: InsClass) m.
(Foldable (sig f), Monoid m) =>
TagH sig tag f m -> m
forall (sig :: SigClass) k (tag :: k) (f :: InsClass) a.
Foldable (sig f) =>
TagH sig tag f a -> Bool
forall (sig :: SigClass) k (tag :: k) (f :: InsClass) a.
Foldable (sig f) =>
TagH sig tag f a -> Int
forall (sig :: SigClass) k (tag :: k) (f :: InsClass) a.
Foldable (sig f) =>
TagH sig tag f a -> [a]
forall (sig :: SigClass) k (tag :: k) (f :: InsClass) a.
Foldable (sig f) =>
(a -> a -> a) -> TagH sig tag f a -> a
forall (sig :: SigClass) k (tag :: k) (f :: InsClass) m a.
(Foldable (sig f), Monoid m) =>
(a -> m) -> TagH sig tag f a -> m
forall (sig :: SigClass) k (tag :: k) (f :: InsClass) b a.
Foldable (sig f) =>
(b -> a -> b) -> b -> TagH sig tag f a -> b
forall (sig :: SigClass) k (tag :: k) (f :: InsClass) a b.
Foldable (sig f) =>
(a -> b -> b) -> b -> TagH sig tag f a -> b
product :: forall a. Num a => TagH sig tag f a -> a
$cproduct :: forall (sig :: SigClass) k (tag :: k) (f :: InsClass) a.
(Foldable (sig f), Num a) =>
TagH sig tag f a -> a
sum :: forall a. Num a => TagH sig tag f a -> a
$csum :: forall (sig :: SigClass) k (tag :: k) (f :: InsClass) a.
(Foldable (sig f), Num a) =>
TagH sig tag f a -> a
minimum :: forall a. Ord a => TagH sig tag f a -> a
$cminimum :: forall (sig :: SigClass) k (tag :: k) (f :: InsClass) a.
(Foldable (sig f), Ord a) =>
TagH sig tag f a -> a
maximum :: forall a. Ord a => TagH sig tag f a -> a
$cmaximum :: forall (sig :: SigClass) k (tag :: k) (f :: InsClass) a.
(Foldable (sig f), Ord a) =>
TagH sig tag f a -> a
elem :: forall a. Eq a => a -> TagH sig tag f a -> Bool
$celem :: forall (sig :: SigClass) k (tag :: k) (f :: InsClass) a.
(Foldable (sig f), Eq a) =>
a -> TagH sig tag f a -> Bool
length :: forall a. TagH sig tag f a -> Int
$clength :: forall (sig :: SigClass) k (tag :: k) (f :: InsClass) a.
Foldable (sig f) =>
TagH sig tag f a -> Int
null :: forall a. TagH sig tag f a -> Bool
$cnull :: forall (sig :: SigClass) k (tag :: k) (f :: InsClass) a.
Foldable (sig f) =>
TagH sig tag f a -> Bool
toList :: forall a. TagH sig tag f a -> [a]
$ctoList :: forall (sig :: SigClass) k (tag :: k) (f :: InsClass) a.
Foldable (sig f) =>
TagH sig tag f a -> [a]
foldl1 :: forall a. (a -> a -> a) -> TagH sig tag f a -> a
$cfoldl1 :: forall (sig :: SigClass) k (tag :: k) (f :: InsClass) a.
Foldable (sig f) =>
(a -> a -> a) -> TagH sig tag f a -> a
foldr1 :: forall a. (a -> a -> a) -> TagH sig tag f a -> a
$cfoldr1 :: forall (sig :: SigClass) k (tag :: k) (f :: InsClass) a.
Foldable (sig f) =>
(a -> a -> a) -> TagH sig tag f a -> a
foldl' :: forall b a. (b -> a -> b) -> b -> TagH sig tag f a -> b
$cfoldl' :: forall (sig :: SigClass) k (tag :: k) (f :: InsClass) b a.
Foldable (sig f) =>
(b -> a -> b) -> b -> TagH sig tag f a -> b
foldl :: forall b a. (b -> a -> b) -> b -> TagH sig tag f a -> b
$cfoldl :: forall (sig :: SigClass) k (tag :: k) (f :: InsClass) b a.
Foldable (sig f) =>
(b -> a -> b) -> b -> TagH sig tag f a -> b
foldr' :: forall a b. (a -> b -> b) -> b -> TagH sig tag f a -> b
$cfoldr' :: forall (sig :: SigClass) k (tag :: k) (f :: InsClass) a b.
Foldable (sig f) =>
(a -> b -> b) -> b -> TagH sig tag f a -> b
foldr :: forall a b. (a -> b -> b) -> b -> TagH sig tag f a -> b
$cfoldr :: forall (sig :: SigClass) k (tag :: k) (f :: InsClass) a b.
Foldable (sig f) =>
(a -> b -> b) -> b -> TagH sig tag f a -> b
foldMap' :: forall m a. Monoid m => (a -> m) -> TagH sig tag f a -> m
$cfoldMap' :: forall (sig :: SigClass) k (tag :: k) (f :: InsClass) m a.
(Foldable (sig f), Monoid m) =>
(a -> m) -> TagH sig tag f a -> m
foldMap :: forall m a. Monoid m => (a -> m) -> TagH sig tag f a -> m
$cfoldMap :: forall (sig :: SigClass) k (tag :: k) (f :: InsClass) m a.
(Foldable (sig f), Monoid m) =>
(a -> m) -> TagH sig tag f a -> m
fold :: forall m. Monoid m => TagH sig tag f m -> m
$cfold :: forall (sig :: SigClass) k (tag :: k) (f :: InsClass) m.
(Foldable (sig f), Monoid m) =>
TagH sig tag f m -> m
Foldable, forall (t :: InsClass).
Functor t
-> Foldable t
-> (forall (f :: InsClass) a b.
    Applicative f =>
    (a -> f b) -> t a -> f (t b))
-> (forall (f :: InsClass) a. Applicative f => t (f a) -> f (t a))
-> (forall (m :: InsClass) a b.
    Monad m =>
    (a -> m b) -> t a -> m (t b))
-> (forall (m :: InsClass) a. Monad m => t (m a) -> m (t a))
-> Traversable t
forall (f :: InsClass) a b.
Applicative f =>
(a -> f b) -> TagH sig tag f a -> f (TagH sig tag f b)
forall {sig :: SigClass} {k} {tag :: k} {f :: InsClass}.
Traversable (sig f) =>
Functor (TagH sig tag f)
forall {sig :: SigClass} {k} {tag :: k} {f :: InsClass}.
Traversable (sig f) =>
Foldable (TagH sig tag f)
forall (sig :: SigClass) k (tag :: k) (f :: InsClass)
       (m :: InsClass) a.
(Traversable (sig f), Monad m) =>
TagH sig tag f (m a) -> m (TagH sig tag f a)
forall (sig :: SigClass) k (tag :: k) (f :: InsClass)
       (f :: InsClass) a.
(Traversable (sig f), Applicative f) =>
TagH sig tag f (f a) -> f (TagH sig tag f a)
forall (sig :: SigClass) k (tag :: k) (f :: InsClass)
       (m :: InsClass) a b.
(Traversable (sig f), Monad m) =>
(a -> m b) -> TagH sig tag f a -> m (TagH sig tag f b)
forall (sig :: SigClass) k (tag :: k) (f :: InsClass)
       (f :: InsClass) a b.
(Traversable (sig f), Applicative f) =>
(a -> f b) -> TagH sig tag f a -> f (TagH sig tag f b)
sequence :: forall (m :: InsClass) a.
Monad m =>
TagH sig tag f (m a) -> m (TagH sig tag f a)
$csequence :: forall (sig :: SigClass) k (tag :: k) (f :: InsClass)
       (m :: InsClass) a.
(Traversable (sig f), Monad m) =>
TagH sig tag f (m a) -> m (TagH sig tag f a)
mapM :: forall (m :: InsClass) a b.
Monad m =>
(a -> m b) -> TagH sig tag f a -> m (TagH sig tag f b)
$cmapM :: forall (sig :: SigClass) k (tag :: k) (f :: InsClass)
       (m :: InsClass) a b.
(Traversable (sig f), Monad m) =>
(a -> m b) -> TagH sig tag f a -> m (TagH sig tag f b)
sequenceA :: forall (f :: InsClass) a.
Applicative f =>
TagH sig tag f (f a) -> f (TagH sig tag f a)
$csequenceA :: forall (sig :: SigClass) k (tag :: k) (f :: InsClass)
       (f :: InsClass) a.
(Traversable (sig f), Applicative f) =>
TagH sig tag f (f a) -> f (TagH sig tag f a)
traverse :: forall (f :: InsClass) a b.
Applicative f =>
(a -> f b) -> TagH sig tag f a -> f (TagH sig tag f b)
$ctraverse :: forall (sig :: SigClass) k (tag :: k) (f :: InsClass)
       (f :: InsClass) a b.
(Traversable (sig f), Applicative f) =>
(a -> f b) -> TagH sig tag f a -> f (TagH sig tag f b)
Traversable)
    deriving newtype (forall (f :: InsClass) (g :: InsClass).
(f :-> g) -> TagH sig tag f :-> TagH sig tag g
forall (h :: SigClass).
(forall (f :: InsClass) (g :: InsClass). (f :-> g) -> h f :-> h g)
-> HFunctor h
forall (sig :: SigClass) k (tag :: k) (f :: InsClass)
       (g :: InsClass).
HFunctor sig =>
(f :-> g) -> TagH sig tag f :-> TagH sig tag g
hfmap :: forall (f :: InsClass) (g :: InsClass).
(f :-> g) -> TagH sig tag f :-> TagH sig tag g
$chfmap :: forall (sig :: SigClass) k (tag :: k) (f :: InsClass)
       (g :: InsClass).
HFunctor sig =>
(f :-> g) -> TagH sig tag f :-> TagH sig tag g
HFunctor)

-- | Tagged /signature class/.
type (##) = TagH

infixl 8 ##

-- | Tagged /signature class/.
pattern TH :: forall tag sig f a. sig f a -> TagH sig tag f a
pattern $bTH :: forall {k} (tag :: k) (sig :: SigClass) (f :: InsClass) a.
sig f a -> TagH sig tag f a
$mTH :: forall {r} {k} {tag :: k} {sig :: SigClass} {f :: InsClass} {a}.
TagH sig tag f a -> (sig f a -> r) -> ((# #) -> r) -> r
TH e = TagH e

{-# COMPLETE TH #-}