{-# 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.Key where

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

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

-- | Keyed /instruction class/.
type (#>) = Key

infixr 7 #>

-- | Keyed /instruction class/.
pattern K :: forall key ins a. ins a -> Key key ins a
pattern $bK :: forall {k} (key :: k) (ins :: InsClass) a. ins a -> Key key ins a
$mK :: forall {r} {k} {key :: k} {ins :: InsClass} {a}.
Key key ins a -> (ins a -> r) -> ((# #) -> r) -> r
K e = Key e

{-# COMPLETE K #-}

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

-- | Keyed /signature class/.
type (##>) = KeyH

infixr 7 ##>

-- | Keyed /signature class/.
pattern KH :: forall key sig f a. sig f a -> KeyH key sig f a
pattern $bKH :: forall {k} (key :: k) (sig :: SigClass) (f :: InsClass) a.
sig f a -> KeyH key sig f a
$mKH :: forall {r} {k} {key :: k} {sig :: SigClass} {f :: InsClass} {a}.
KeyH key sig f a -> (sig f a -> r) -> ((# #) -> r) -> r
KH e = KeyH e

{-# COMPLETE KH #-}