@@ -3,12 +3,15 @@ module Cooked.Tweak.Guard
33 assertPredTweak ,
44 guardTweak ,
55 guardPredTweak ,
6+ labelled ,
7+ labelled' ,
68 )
79where
810
911import Control.Monad
1012import Cooked.Skeleton
1113import Cooked.Tweak.Common
14+ import Data.Text (Text )
1215import Optics.Core
1316import Polysemy
1417import Polysemy.NonDet
@@ -47,3 +50,48 @@ guardPredTweak ::
4750 (a -> Bool ) ->
4851 Sem effs ()
4952guardPredTweak optic p = assertPredTweak optic p >>= guard
53+
54+ -- | Apply a tweak to a given transaction if it has a specific label. Fails if
55+ -- it does not.
56+ --
57+ -- >
58+ -- > someEndpoint = do
59+ -- > ...
60+ -- > validateTxSkel' txSkelTemplate
61+ -- > { txSkelLabels =
62+ -- > [ TxSkelLabel "InitialMinting"
63+ -- > , TxSkelLabel "AuctionWorkflow"
64+ -- > , TxSkelLabel SomeLabelType]
65+ -- > }
66+ -- >
67+ -- > someTest = someEndpoint & eveywhere (labelled SomeLabelType someTweak)
68+ -- > anotherTest = someEndpoint & somewhere (labelled SomeLabelType someTweak)
69+ labelled ::
70+ ( LabelConstrs lbl ,
71+ Members '[Tweak , NonDet ] effs
72+ ) =>
73+ lbl ->
74+ Sem effs a ->
75+ Sem effs a
76+ labelled lbl = (guardTweak (txSkelLabelsL % at (TxSkelLabel lbl) % _Just) >> )
77+
78+ -- | `labelled` specialised to Text labels
79+ --
80+ -- >
81+ -- > someEndpoint = do
82+ -- > ...
83+ -- > validateTxSkel' txSkelTemplate
84+ -- > { txSkelLabels =
85+ -- > [ TxSkelLabel "InitialMinting"
86+ -- > , TxSkelLabel "AuctionWorkflow"
87+ -- > , TxSkelLabel "Spending"
88+ -- > , TxSkelLabel SomeLabelType]
89+ -- > }
90+ -- >
91+ -- > someTest = someEndpoint & somewhere (labelled' "Spending" doubleSatAttack)
92+ labelled' ::
93+ (Members '[Tweak , NonDet ] effs ) =>
94+ Text ->
95+ Sem effs a ->
96+ Sem effs a
97+ labelled' = labelled
0 commit comments