{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE GADTSyntax #-}
{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneKindSignatures #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE UndecidableSuperClasses #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE BlockArguments #-}
module Dep.SimpleAdvice
(
advising,
AspectT (..),
Advice,
makeAdvice,
makeArgsAdvice,
makeExecutionAdvice,
advise,
restrictArgs,
adviseRecord,
Top,
And,
All,
NP (..),
I (..),
cfoldMap_NP,
Dict (..),
)
where
import Dep.Has
import Dep.SimpleAdvice.Internal
import Data.Coerce
import Control.Monad
import Control.Monad.Fix
import Data.Functor.Identity
import Data.Kind
import Data.List.NonEmpty qualified as N
import Data.SOP
import Data.SOP.Dict
import Data.SOP.NP
import Data.List.NonEmpty
import Data.Typeable
import GHC.Generics qualified as G
import GHC.TypeLits
import Control.Applicative
import Control.Monad.Cont.Class
import Control.Monad.Error.Class
import Control.Monad.IO.Unlift
import Control.Monad.State.Class
import Control.Monad.Trans.Class
import Control.Monad.Trans.Identity
import Control.Monad.Writer.Class
import Control.Monad.Zip
makeAdvice ::
forall ca m r.
( forall as.
All ca as =>
NP I as ->
AspectT m (AspectT m r -> AspectT m r, NP I as)
) ->
Advice ca m r
makeAdvice :: (forall (as :: [*]).
All ca as =>
NP I as -> AspectT m (AspectT m r -> AspectT m r, NP I as))
-> Advice ca m r
makeAdvice = (forall (as :: [*]).
All ca as =>
NP I as -> AspectT m (AspectT m r -> AspectT m r, NP I as))
-> Advice ca m r
forall (ca :: * -> Constraint) (m :: * -> *) r.
(forall (as :: [*]).
All ca as =>
NP I as -> AspectT m (AspectT m r -> AspectT m r, NP I as))
-> Advice ca m r
Advice
makeArgsAdvice ::
forall ca m r.
Monad m =>
( forall as.
All ca as =>
NP I as ->
AspectT m (NP I as)
) ->
Advice ca m r
makeArgsAdvice :: (forall (as :: [*]). All ca as => NP I as -> AspectT m (NP I as))
-> Advice ca m r
makeArgsAdvice forall (as :: [*]). All ca as => NP I as -> AspectT m (NP I as)
tweakArgs =
(forall (as :: [*]).
All ca as =>
NP I as -> AspectT m (AspectT m r -> AspectT m r, NP I as))
-> Advice ca m r
forall (ca :: * -> Constraint) (m :: * -> *) r.
(forall (as :: [*]).
All ca as =>
NP I as -> AspectT m (AspectT m r -> AspectT m r, NP I as))
-> Advice ca m r
makeAdvice ((forall (as :: [*]).
All ca as =>
NP I as -> AspectT m (AspectT m r -> AspectT m r, NP I as))
-> Advice ca m r)
-> (forall (as :: [*]).
All ca as =>
NP I as -> AspectT m (AspectT m r -> AspectT m r, NP I as))
-> Advice ca m r
forall a b. (a -> b) -> a -> b
$ \NP I as
args -> do
NP I as
args' <- NP I as -> AspectT m (NP I as)
forall (as :: [*]). All ca as => NP I as -> AspectT m (NP I as)
tweakArgs NP I as
args
(AspectT m r -> AspectT m r, NP I as)
-> AspectT m (AspectT m r -> AspectT m r, NP I as)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (AspectT m r -> AspectT m r
forall a. a -> a
id, NP I as
args')
makeExecutionAdvice ::
forall ca m r.
Applicative m =>
( AspectT m r ->
AspectT m r
) ->
Advice ca m r
makeExecutionAdvice :: (AspectT m r -> AspectT m r) -> Advice ca m r
makeExecutionAdvice AspectT m r -> AspectT m r
tweakExecution = (forall (as :: [*]).
All ca as =>
NP I as -> AspectT m (AspectT m r -> AspectT m r, NP I as))
-> Advice ca m r
forall (ca :: * -> Constraint) (m :: * -> *) r.
(forall (as :: [*]).
All ca as =>
NP I as -> AspectT m (AspectT m r -> AspectT m r, NP I as))
-> Advice ca m r
makeAdvice \NP I as
args -> (AspectT m r -> AspectT m r, NP I as)
-> AspectT m (AspectT m r -> AspectT m r, NP I as)
forall (f :: * -> *) a. Applicative f => a -> f a
pure (AspectT m r -> AspectT m r
tweakExecution, NP I as
args)
advise ::
forall ca m r as advisee.
(Multicurryable as m r advisee, All ca as, Monad m) =>
Advice ca m r ->
advisee ->
advisee
advise :: Advice ca m r -> advisee -> advisee
advise (Advice forall (as :: [*]).
All ca as =>
NP I as -> AspectT m (AspectT m r -> AspectT m r, NP I as)
f) advisee
advisee = do
let uncurried :: NP I as -> AspectT m r
uncurried = advisee -> NP I as -> AspectT m r
forall (as :: [*]) (m :: * -> *) r curried.
Multicurryable as m r curried =>
curried -> NP I as -> AspectT m r
multiuncurry @as @m @r advisee
advisee
uncurried' :: NP I as -> AspectT m r
uncurried' NP I as
args = do
(AspectT m r -> AspectT m r
tweakExecution, NP I as
args') <- NP I as -> AspectT m (AspectT m r -> AspectT m r, NP I as)
forall (as :: [*]).
All ca as =>
NP I as -> AspectT m (AspectT m r -> AspectT m r, NP I as)
f NP I as
args
AspectT m r -> AspectT m r
tweakExecution (NP I as -> AspectT m r
uncurried NP I as
args')
in (NP I as -> AspectT m r) -> advisee
forall (as :: [*]) (m :: * -> *) r curried.
Multicurryable as m r curried =>
(NP I as -> AspectT m r) -> curried
multicurry @as @m @r NP I as -> AspectT m r
uncurried'
advising
:: Coercible (r_ m) (r_ (AspectT m)) =>
(r_ (AspectT m) -> r_ (AspectT m)) ->
r_ m -> r_ m
advising :: (r_ (AspectT m) -> r_ (AspectT m)) -> r_ m -> r_ m
advising r_ (AspectT m) -> r_ (AspectT m)
f = r_ (AspectT m) -> r_ m
coerce (r_ (AspectT m) -> r_ m)
-> (r_ m -> r_ (AspectT m)) -> r_ m -> r_ m
forall b c a. (b -> c) -> (a -> b) -> a -> c
. r_ (AspectT m) -> r_ (AspectT m)
f (r_ (AspectT m) -> r_ (AspectT m))
-> (r_ m -> r_ (AspectT m)) -> r_ m -> r_ (AspectT m)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. r_ m -> r_ (AspectT m)
coerce
type Multicurryable ::
[Type] ->
(Type -> Type) ->
Type ->
Type ->
Constraint
class Multicurryable as m r curried | curried -> as m r where
multiuncurry :: curried -> NP I as -> AspectT m r
multicurry :: (NP I as -> AspectT m r) -> curried
instance Monad m => Multicurryable '[] m r (AspectT m r) where
multiuncurry :: AspectT m r -> NP I '[] -> AspectT m r
multiuncurry AspectT m r
action NP I '[]
Nil = AspectT m r
action
multicurry :: (NP I '[] -> AspectT m r) -> AspectT m r
multicurry NP I '[] -> AspectT m r
f = NP I '[] -> AspectT m r
f NP I '[]
forall k (a :: k -> *). NP a '[]
Nil
instance Multicurryable as m r curried => Multicurryable (a ': as) m r (a -> curried) where
multiuncurry :: (a -> curried) -> NP I (a : as) -> AspectT m r
multiuncurry a -> curried
f (I x
a :* NP I xs
as) = curried -> NP I as -> AspectT m r
forall (as :: [*]) (m :: * -> *) r curried.
Multicurryable as m r curried =>
curried -> NP I as -> AspectT m r
multiuncurry @as @m @r @curried (a -> curried
f a
x
a) NP I as
NP I xs
as
multicurry :: (NP I (a : as) -> AspectT m r) -> a -> curried
multicurry NP I (a : as) -> AspectT m r
f a
a = (NP I as -> AspectT m r) -> curried
forall (as :: [*]) (m :: * -> *) r curried.
Multicurryable as m r curried =>
(NP I as -> AspectT m r) -> curried
multicurry @as @m @r @curried (NP I (a : as) -> AspectT m r
f (NP I (a : as) -> AspectT m r)
-> (NP I as -> NP I (a : as)) -> NP I as -> AspectT m r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. I a -> NP I as -> NP I (a : as)
forall k (a :: k -> *) (x :: k) (xs :: [k]).
a x -> NP a xs -> NP a (x : xs)
(:*) (a -> I a
forall a. a -> I a
I a
a))
restrictArgs ::
forall more less m r.
(forall x. Dict more x -> Dict less x) ->
Advice less m r ->
Advice more m r
restrictArgs :: (forall x. Dict more x -> Dict less x)
-> Advice less m r -> Advice more m r
restrictArgs forall x. Dict more x -> Dict less x
evidence (Advice forall (as :: [*]).
All less as =>
NP I as -> AspectT m (AspectT m r -> AspectT m r, NP I as)
advice) = (forall (as :: [*]).
All more as =>
NP I as -> AspectT m (AspectT m r -> AspectT m r, NP I as))
-> Advice more m r
forall (ca :: * -> Constraint) (m :: * -> *) r.
(forall (as :: [*]).
All ca as =>
NP I as -> AspectT m (AspectT m r -> AspectT m r, NP I as))
-> Advice ca m r
Advice \NP I as
args ->
let advice' :: forall as. All more as => NP I as -> AspectT m (AspectT m r -> AspectT m r, NP I as)
advice' :: NP I as -> AspectT m (AspectT m r -> AspectT m r, NP I as)
advice' NP I as
args' =
case (forall x. Dict more x -> Dict less x)
-> Dict (All more) as -> Dict (All less) as
forall k (c :: k -> Constraint) (d :: k -> Constraint) (xs :: [k]).
(forall (a :: k). Dict c a -> Dict d a)
-> Dict (All c) xs -> Dict (All d) xs
Data.SOP.Dict.mapAll @more @less forall x. Dict more x -> Dict less x
evidence of
Dict (All more) as -> Dict (All less) as
f -> case Dict (All more) as -> Dict (All less) as
f (All more as => Dict (All more) as
forall k (c :: k -> Constraint) (a :: k). c a => Dict c a
Dict @(All more) @as) of
Dict (All less) as
Dict -> NP I as -> AspectT m (AspectT m r -> AspectT m r, NP I as)
forall (as :: [*]).
All less as =>
NP I as -> AspectT m (AspectT m r -> AspectT m r, NP I as)
advice NP I as
args'
in NP I as -> AspectT m (AspectT m r -> AspectT m r, NP I as)
forall (as :: [*]).
All more as =>
NP I as -> AspectT m (AspectT m r -> AspectT m r, NP I as)
advice' NP I as
args
type AdvisedRecord :: (Type -> Constraint) -> (Type -> Type) -> (Type -> Constraint) -> ((Type -> Type) -> Type) -> Constraint
class AdvisedRecord ca m cr advised where
_adviseRecord :: [(TypeRep, String)] -> (forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r) -> advised (AspectT m) -> advised (AspectT m)
type AdvisedProduct :: (Type -> Constraint) -> (Type -> Type) -> (Type -> Constraint) -> (k -> Type) -> Constraint
class AdvisedProduct ca m cr advised_ where
_adviseProduct :: TypeRep -> [(TypeRep, String)] -> (forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r) -> advised_ k -> advised_ k
instance
( G.Generic (advised (AspectT m)),
G.Rep (advised (AspectT m)) ~ G.D1 x (G.C1 y advised_),
Typeable advised,
AdvisedProduct ca m cr advised_
) =>
AdvisedRecord ca m cr advised
where
_adviseRecord :: [(TypeRep, String)]
-> (forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r)
-> advised (AspectT m)
-> advised (AspectT m)
_adviseRecord [(TypeRep, String)]
acc forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r
f advised (AspectT m)
unadvised =
let G.M1 (G.M1 advised_ Any
unadvised_) = advised (AspectT m) -> Rep (advised (AspectT m)) Any
forall a x. Generic a => a -> Rep a x
G.from advised (AspectT m)
unadvised
advised_ :: advised_ Any
advised_ = TypeRep
-> [(TypeRep, String)]
-> (forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r)
-> advised_ Any
-> advised_ Any
forall k (ca :: * -> Constraint) (m :: * -> *)
(cr :: * -> Constraint) (advised_ :: k -> *) (k :: k).
AdvisedProduct ca m cr advised_ =>
TypeRep
-> [(TypeRep, String)]
-> (forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r)
-> advised_ k
-> advised_ k
_adviseProduct @_ @ca @m @cr (Proxy advised -> TypeRep
forall k (proxy :: k -> *) (a :: k).
Typeable a =>
proxy a -> TypeRep
typeRep (Proxy advised
forall k (t :: k). Proxy t
Proxy @advised)) [(TypeRep, String)]
acc forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r
f advised_ Any
unadvised_
in Rep (advised (AspectT m)) Any -> advised (AspectT m)
forall a x. Generic a => Rep a x -> a
G.to (M1 C y advised_ Any -> M1 D x (C1 y advised_) Any
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
G.M1 (advised_ Any -> M1 C y advised_ Any
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
G.M1 advised_ Any
advised_))
instance
( AdvisedProduct ca m cr advised_left,
AdvisedProduct ca m cr advised_right
) =>
AdvisedProduct ca m cr (advised_left G.:*: advised_right)
where
_adviseProduct :: TypeRep
-> [(TypeRep, String)]
-> (forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r)
-> (:*:) advised_left advised_right k
-> (:*:) advised_left advised_right k
_adviseProduct TypeRep
tr [(TypeRep, String)]
acc forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r
f (advised_left k
unadvised_left G.:*: advised_right k
unadvised_right) = TypeRep
-> [(TypeRep, String)]
-> (forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r)
-> advised_left k
-> advised_left k
forall k (ca :: * -> Constraint) (m :: * -> *)
(cr :: * -> Constraint) (advised_ :: k -> *) (k :: k).
AdvisedProduct ca m cr advised_ =>
TypeRep
-> [(TypeRep, String)]
-> (forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r)
-> advised_ k
-> advised_ k
_adviseProduct @_ @ca @m @cr TypeRep
tr [(TypeRep, String)]
acc forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r
f advised_left k
unadvised_left advised_left k
-> advised_right k -> (:*:) advised_left advised_right k
forall k (f :: k -> *) (g :: k -> *) (p :: k).
f p -> g p -> (:*:) f g p
G.:*: TypeRep
-> [(TypeRep, String)]
-> (forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r)
-> advised_right k
-> advised_right k
forall k (ca :: * -> Constraint) (m :: * -> *)
(cr :: * -> Constraint) (advised_ :: k -> *) (k :: k).
AdvisedProduct ca m cr advised_ =>
TypeRep
-> [(TypeRep, String)]
-> (forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r)
-> advised_ k
-> advised_ k
_adviseProduct @_ @ca @m @cr TypeRep
tr [(TypeRep, String)]
acc forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r
f advised_right k
unadvised_right
data RecordComponent
= Terminal
| IWrapped
| Recurse
type DiscriminateAdvisedComponent :: Type -> RecordComponent
type family DiscriminateAdvisedComponent c where
DiscriminateAdvisedComponent (a -> b) = Terminal
DiscriminateAdvisedComponent (AspectT m x) = Terminal
DiscriminateAdvisedComponent (Identity _) = IWrapped
DiscriminateAdvisedComponent (I _) = IWrapped
DiscriminateAdvisedComponent _ = Recurse
type AdvisedComponent :: RecordComponent -> (Type -> Constraint) -> (Type -> Type) -> (Type -> Constraint) -> Type -> Constraint
class AdvisedComponent component_type ca m cr advised where
_adviseComponent :: [(TypeRep, String)] -> (forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r) -> advised -> advised
instance
( AdvisedComponent (DiscriminateAdvisedComponent advised) ca m cr advised,
KnownSymbol fieldName
) =>
AdvisedProduct ca m cr (G.S1 ( 'G.MetaSel ( 'Just fieldName) su ss ds) (G.Rec0 advised))
where
_adviseProduct :: TypeRep
-> [(TypeRep, String)]
-> (forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r)
-> S1 ('MetaSel ('Just fieldName) su ss ds) (Rec0 advised) k
-> S1 ('MetaSel ('Just fieldName) su ss ds) (Rec0 advised) k
_adviseProduct TypeRep
tr [(TypeRep, String)]
acc forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r
f (G.M1 (G.K1 advised
advised)) =
let acc' :: [(TypeRep, String)]
acc' = (TypeRep
tr, Proxy fieldName -> String
forall (n :: Symbol) (proxy :: Symbol -> *).
KnownSymbol n =>
proxy n -> String
symbolVal (Proxy fieldName
forall k (t :: k). Proxy t
Proxy @fieldName)) (TypeRep, String) -> [(TypeRep, String)] -> [(TypeRep, String)]
forall a. a -> [a] -> [a]
: [(TypeRep, String)]
acc
in K1 R advised k
-> S1 ('MetaSel ('Just fieldName) su ss ds) (Rec0 advised) k
forall k i (c :: Meta) (f :: k -> *) (p :: k). f p -> M1 i c f p
G.M1 (advised -> K1 R advised k
forall k i c (p :: k). c -> K1 i c p
G.K1 ([(TypeRep, String)]
-> (forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r)
-> advised
-> advised
forall (component_type :: RecordComponent) (ca :: * -> Constraint)
(m :: * -> *) (cr :: * -> Constraint) advised.
AdvisedComponent component_type ca m cr advised =>
[(TypeRep, String)]
-> (forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r)
-> advised
-> advised
_adviseComponent @(DiscriminateAdvisedComponent advised) @ca @m @cr [(TypeRep, String)]
acc' forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r
f advised
advised))
instance
AdvisedRecord ca m cr advisable =>
AdvisedComponent Recurse ca m cr (advisable (AspectT m))
where
_adviseComponent :: [(TypeRep, String)]
-> (forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r)
-> advisable (AspectT m)
-> advisable (AspectT m)
_adviseComponent [(TypeRep, String)]
acc forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r
f advisable (AspectT m)
advised = [(TypeRep, String)]
-> (forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r)
-> advisable (AspectT m)
-> advisable (AspectT m)
forall (ca :: * -> Constraint) (m :: * -> *)
(cr :: * -> Constraint) (advisable :: (* -> *) -> *).
AdvisedRecord ca m cr advisable =>
[(TypeRep, String)]
-> (forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r)
-> advisable (AspectT m)
-> advisable (AspectT m)
_adviseRecord @ca @m @cr [(TypeRep, String)]
acc forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r
f advisable (AspectT m)
advised
instance
(Multicurryable as m r advised, All ca as, cr r, Monad m) =>
AdvisedComponent Terminal ca m cr advised
where
_adviseComponent :: [(TypeRep, String)]
-> (forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r)
-> advised
-> advised
_adviseComponent [(TypeRep, String)]
acc forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r
f advised
advised = Advice ca m r -> advised -> advised
forall (ca :: * -> Constraint) (m :: * -> *) r (as :: [*]) advisee.
(Multicurryable as m r advisee, All ca as, Monad m) =>
Advice ca m r -> advisee -> advisee
advise @ca @m (NonEmpty (TypeRep, String) -> Advice ca m r
forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r
f ([(TypeRep, String)] -> NonEmpty (TypeRep, String)
forall a. [a] -> NonEmpty a
Data.List.NonEmpty.fromList [(TypeRep, String)]
acc)) advised
advised
instance
AdvisedComponent (DiscriminateAdvisedComponent advised) ca m cr advised =>
AdvisedComponent IWrapped ca m cr (Identity advised)
where
_adviseComponent :: [(TypeRep, String)]
-> (forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r)
-> Identity advised
-> Identity advised
_adviseComponent [(TypeRep, String)]
acc forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r
f (Identity advised
advised) = advised -> Identity advised
forall a. a -> Identity a
Identity ([(TypeRep, String)]
-> (forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r)
-> advised
-> advised
forall (component_type :: RecordComponent) (ca :: * -> Constraint)
(m :: * -> *) (cr :: * -> Constraint) advised.
AdvisedComponent component_type ca m cr advised =>
[(TypeRep, String)]
-> (forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r)
-> advised
-> advised
_adviseComponent @(DiscriminateAdvisedComponent advised) @ca @m @cr [(TypeRep, String)]
acc forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r
f advised
advised)
instance
AdvisedComponent (DiscriminateAdvisedComponent advised) ca m cr advised =>
AdvisedComponent IWrapped ca m cr (I advised)
where
_adviseComponent :: [(TypeRep, String)]
-> (forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r)
-> I advised
-> I advised
_adviseComponent [(TypeRep, String)]
acc forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r
f (I advised
advised) = advised -> I advised
forall a. a -> I a
I ([(TypeRep, String)]
-> (forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r)
-> advised
-> advised
forall (component_type :: RecordComponent) (ca :: * -> Constraint)
(m :: * -> *) (cr :: * -> Constraint) advised.
AdvisedComponent component_type ca m cr advised =>
[(TypeRep, String)]
-> (forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r)
-> advised
-> advised
_adviseComponent @(DiscriminateAdvisedComponent advised) @ca @m @cr [(TypeRep, String)]
acc forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r
f advised
advised)
adviseRecord ::
forall ca cr m advised.
AdvisedRecord ca m cr advised =>
(forall r . cr r => NonEmpty (TypeRep, String) -> Advice ca m r) ->
advised (AspectT m) ->
advised (AspectT m)
adviseRecord :: (forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r)
-> advised (AspectT m) -> advised (AspectT m)
adviseRecord = [(TypeRep, String)]
-> (forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r)
-> advised (AspectT m)
-> advised (AspectT m)
forall (ca :: * -> Constraint) (m :: * -> *)
(cr :: * -> Constraint) (advisable :: (* -> *) -> *).
AdvisedRecord ca m cr advisable =>
[(TypeRep, String)]
-> (forall r. cr r => NonEmpty (TypeRep, String) -> Advice ca m r)
-> advisable (AspectT m)
-> advisable (AspectT m)
_adviseRecord @ca @m @cr []