Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Store evaluation with its simulation #155

Merged
merged 3 commits into from
Dec 1, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion plutus-playground-client/src/Action/View.purs
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ actionPaneBody index (AddBlocks { blocks }) =
, formGroup_
[ formRow_
[ label [ classes [ col, colFormLabel ] ]
[ text "Blocks" ]
[ text "Slots" ]
, col_
[ input
[ type_ InputNumber
Expand Down
21 changes: 7 additions & 14 deletions plutus-playground-client/src/Cursor.purs
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,7 @@ import Data.Array as Array
import Data.Argonaut.Decode (class DecodeJson, decodeJson)
import Data.Argonaut.Encode (class EncodeJson, encodeJson)
import Data.Foldable (class Foldable, foldMap, foldl, foldr)
import Data.Lens (Traversal', wander)
import Data.Lens.AffineTraversal (affineTraversal)
import Data.Lens.AffineTraversal (AffineTraversal', affineTraversal)
import Data.Lens.Index (class Index)
import Data.Maybe (fromMaybe, maybe)
import Data.Ord as Ord
Expand Down Expand Up @@ -79,18 +78,12 @@ instance encodeCursor :: EncodeJson a => EncodeJson (Cursor a) where
instance decodeCursor :: DecodeJson a => DecodeJson (Cursor a) where
decodeJson value = uncurry Cursor <$> decodeJson value

_current :: forall a. Traversal' (Cursor a) a
_current =
wander \coalg (Cursor index xs) ->
Array.index xs index
# maybe
(pure xs)
( let
f x = fromMaybe xs $ Array.updateAt index x xs
in
coalg >>> map f
)
# map (Cursor index)
_current :: forall a. AffineTraversal' (Cursor a) a
_current = affineTraversal set pre
where
set (Cursor index xs) a = Cursor index $ fromMaybe xs $ Array.updateAt index a xs

pre c@(Cursor index xs) = maybe (Left c) Right $ Array.index xs index
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nice 👍


clamp :: forall a. Cursor a -> Cursor a
clamp (Cursor index xs) =
Expand Down
87 changes: 52 additions & 35 deletions plutus-playground-client/src/MainFrame/Lenses.purs
Original file line number Diff line number Diff line change
@@ -1,33 +1,35 @@
module MainFrame.Lenses
( _demoFilesMenuVisible
, _gistErrorPaneVisible
, _currentView
( _actionDrag
, _authStatus
, _balancesChartSlot
, _blockchainVisualisationState
, _compilationResult
, _contractDemoEditorContents
, _contractDemos
, _createGistResult
, _currentDemoName
, _currentView
, _demoFilesMenuVisible
, _editorSlot
, _editorState
, _simulations
, _actionDrag
, _evaluationResult
, _successfulEvaluationResult
, _lastEvaluatedSimulation
, _compilationResult
, _successfulCompilationResult
, _lastSuccessfulCompilationResult
, _authStatus
, _createGistResult
, _functionSchema
, _gistErrorPaneVisible
, _gistUrl
, _blockchainVisualisationState
, _editorSlot
, _balancesChartSlot
, _contractDemoEditorContents
, _simulationId
, _knownCurrencies
, _lastSuccessfulCompilationResult
, _result
, _resultRollup
, _simulation
, _simulationActions
, _simulationBlockchainVisualisationState
, _simulationEvaluationResult
, _simulationId
, _simulationWallets
, _resultRollup
, _functionSchema
, _simulations
, _successfulCompilationResult
, _successfulEvaluationResult
, _walletKeys
, _knownCurrencies
, _result
, _warnings
, getKnownCurrencies
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔠

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The vscode plugin apparently sorts the exports if you tell it to add another one.

) where
Expand All @@ -36,19 +38,20 @@ import Prologue
import Auth (AuthStatus)
import Chain.Types as Chain
import Control.Monad.State.Class (class MonadState)
import Cursor (Cursor)
import Data.Lens (Lens', Traversal', _Right, lens, preview)
import Cursor (Cursor, _current)
import Data.Lens (Lens', _Right, lens, preview, set)
import Data.Lens.Extra (peruse)
import Data.Lens.Iso.Newtype (_Newtype)
import Data.Lens.Record (prop)
import Data.Lens.Types (AffineTraversal')
import Data.Maybe (fromMaybe)
import Editor.Types (State) as Editor
import Gist (Gist)
import Language.Haskell.Interpreter (InterpreterError, InterpreterResult, SourceCode, _InterpreterResult)
import Ledger.CardanoWallet (WalletNumber)
import MainFrame.Types (State, View, WebData)
import Network.RemoteData (_Success)
import Playground.Types (CompilationResult, ContractCall, ContractDemo, EvaluationResult, FunctionSchema, KnownCurrency, PlaygroundError, Simulation, SimulatorWallet)
import MainFrame.Types (FullSimulation, State, View, WebData, WebEvaluationResult)
import Network.RemoteData (_Success, RemoteData(NotAsked))
import Playground.Types (CompilationResult, ContractCall, ContractDemo, EvaluationResult, FunctionSchema, KnownCurrency, Simulation, SimulatorWallet)
import Plutus.V1.Ledger.Crypto (PubKeyHash)
import Schema (FormSchema)
import Schema.Types (FormArgument)
Expand All @@ -73,21 +76,18 @@ _currentDemoName = _Newtype <<< prop (Proxy :: _ "currentDemoName")
_editorState :: Lens' State Editor.State
_editorState = _Newtype <<< prop (Proxy :: _ "editorState")

_simulations :: Lens' State (Cursor Simulation)
_simulations :: Lens' State (Cursor FullSimulation)
_simulations = _Newtype <<< prop (Proxy :: _ "simulations")

_actionDrag :: Lens' State (Maybe Int)
_actionDrag = _Newtype <<< prop (Proxy :: _ "actionDrag")

_evaluationResult :: Lens' State (WebData (Either PlaygroundError EvaluationResult))
_evaluationResult = _Newtype <<< prop (Proxy :: _ "evaluationResult")
_evaluationResult :: Lens' State WebEvaluationResult
_evaluationResult = withDefault NotAsked (_simulations <<< _current <<< _simulationEvaluationResult)

_successfulEvaluationResult :: Traversal' State EvaluationResult
_successfulEvaluationResult :: AffineTraversal' State EvaluationResult
_successfulEvaluationResult = _evaluationResult <<< _Success <<< _Right

_lastEvaluatedSimulation :: Lens' State (Maybe Simulation)
_lastEvaluatedSimulation = _Newtype <<< prop (Proxy :: _ "lastEvaluatedSimulation")

_compilationResult :: Lens' State (WebData (Either InterpreterError (InterpreterResult CompilationResult)))
_compilationResult = _Newtype <<< lens g s
where
Expand All @@ -97,7 +97,7 @@ _compilationResult = _Newtype <<< lens g s
Just cr -> r { compilationResult = c, lastSuccessfulCompilationResult = Just cr }
Nothing -> r { compilationResult = c }

_successfulCompilationResult :: Traversal' State CompilationResult
_successfulCompilationResult :: AffineTraversal' State CompilationResult
_successfulCompilationResult = _compilationResult <<< _Success <<< _Right <<< _InterpreterResult <<< _result

_lastSuccessfulCompilationResult :: Lens' State (Maybe CompilationResult)
Expand All @@ -113,7 +113,24 @@ _gistUrl :: Lens' State (Maybe String)
_gistUrl = _Newtype <<< prop (Proxy :: _ "gistUrl")

_blockchainVisualisationState :: Lens' State Chain.State
_blockchainVisualisationState = _Newtype <<< prop (Proxy :: _ "blockchainVisualisationState")
_blockchainVisualisationState = withDefault Chain.initialState (_simulations <<< _current <<< _simulationBlockchainVisualisationState)

_simulation :: Lens' FullSimulation Simulation
_simulation = prop (Proxy :: _ "simulation")

_simulationEvaluationResult :: Lens' FullSimulation WebEvaluationResult
_simulationEvaluationResult = prop (Proxy :: _ "evaluationResult")

_simulationBlockchainVisualisationState :: Lens' FullSimulation Chain.State
_simulationBlockchainVisualisationState = prop (Proxy :: _ "blockchainVisualisationState")

------------------------------------------------------------
withDefault :: forall s a. a -> AffineTraversal' s a -> Lens' s a
withDefault def l = lens doGet doSet
where
doGet s = fromMaybe def $ preview l s

doSet s a = set l a s

------------------------------------------------------------
_editorSlot :: Proxy "editorSlot"
Expand Down
35 changes: 19 additions & 16 deletions plutus-playground-client/src/MainFrame/State.purs
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,9 @@ import Halogen as H
import Halogen.Query (HalogenM)
import Language.Haskell.Interpreter (CompilationError(..), InterpreterError(..), SourceCode(..))
import Ledger.CardanoWallet (WalletNumber(WalletNumber))
import MainFrame.Lenses (_actionDrag, _authStatus, _blockchainVisualisationState, _compilationResult, _contractDemos, _createGistResult, _currentDemoName, _currentView, _demoFilesMenuVisible, _editorState, _evaluationResult, _functionSchema, _gistErrorPaneVisible, _gistUrl, _knownCurrencies, _lastEvaluatedSimulation, _lastSuccessfulCompilationResult, _resultRollup, _simulationActions, _simulationId, _simulationWallets, _simulations, _successfulCompilationResult, _successfulEvaluationResult, getKnownCurrencies)
import MainFrame.Lenses (_actionDrag, _authStatus, _blockchainVisualisationState, _compilationResult, _contractDemos, _createGistResult, _currentDemoName, _currentView, _demoFilesMenuVisible, _editorState, _evaluationResult, _functionSchema, _gistErrorPaneVisible, _gistUrl, _knownCurrencies, _lastSuccessfulCompilationResult, _resultRollup, _simulation, _simulationActions, _simulationId, _simulationWallets, _simulations, _successfulCompilationResult, _successfulEvaluationResult, getKnownCurrencies)
import MainFrame.MonadApp (class MonadApp, editorGetContents, editorHandleAction, editorSetAnnotations, editorSetContents, getGistByGistId, getOauthStatus, postGistByGistId, postContract, postEvaluation, postGist, preventDefault, resizeBalancesChart, resizeEditor, runHalogenApp, saveBuffer, scrollIntoView, setDataTransferData, setDropEffect)
import MainFrame.Types (ChildSlots, DragAndDropEventType(..), HAction(..), Query, State(..), View(..), WalletEvent(..))
import MainFrame.Types (ChildSlots, DragAndDropEventType(..), FullSimulation, HAction(..), Query, State(..), View(..), WalletEvent(..))
import MainFrame.View (render)
import Monaco (IMarkerData, markerSeverity)
import Network.RemoteData (RemoteData(..), _Success, isSuccess)
Expand Down Expand Up @@ -92,6 +92,13 @@ mkSimulation simulationCurrencies simulationId =
, simulationWallets: mkSimulatorWallet simulationCurrencies <<< BigInt.fromInt <$> 1 .. 2
}

mkFullSimulation :: Simulation -> FullSimulation
mkFullSimulation simulation =
{ simulation
, evaluationResult: NotAsked
, blockchainVisualisationState: Chain.initialState
}

mkInitialState :: forall m. MonadThrow Error m => Editor.State -> m State
mkInitialState editorState = do
contractDemos <-
Expand All @@ -115,12 +122,9 @@ mkInitialState editorState = do
, lastSuccessfulCompilationResult: Nothing
, simulations: Cursor.empty
, actionDrag: Nothing
, evaluationResult: NotAsked
, lastEvaluatedSimulation: Nothing
, authStatus: NotAsked
, createGistResult: NotAsked
, gistUrl: Nothing
, blockchainVisualisationState: Chain.initialState
}

------------------------------------------------------------
Expand Down Expand Up @@ -201,7 +205,7 @@ handleAction (ActionDragAndDrop _ DragLeave _) = pure unit
handleAction (ActionDragAndDrop destination Drop event) = do
use _actionDrag
>>= case _ of
Just source -> modifying (_simulations <<< _current <<< _simulationActions) (Array.move source destination)
Just source -> modifying (_simulations <<< _current <<< _simulation <<< _simulationActions) (Array.move source destination)
_ -> pure unit
preventDefault event
assign _actionDrag Nothing
Expand All @@ -227,7 +231,7 @@ handleAction EvaluateActions =
void
$ runMaybeT
$ do
simulation <- peruse (_simulations <<< _current)
simulation <- peruse (_simulations <<< _current <<< _simulation)
evaluation <-
MaybeT do
contents <- editorGetContents
Expand All @@ -239,7 +243,6 @@ handleAction EvaluateActions =
Success (Right _) -> do
-- on successful evaluation, update last evaluated simulation, and reset and show transactions
when (isSuccess result) do
assign _lastEvaluatedSimulation simulation
assign _blockchainVisualisationState Chain.initialState
-- preselect the first transaction (if any)
mAnnotatedBlockchain <- peruse (_successfulEvaluationResult <<< _resultRollup <<< to AnnotatedBlockchain)
Expand All @@ -266,7 +269,7 @@ handleAction (LoadScript key) = do
assign _demoFilesMenuVisible false
assign _currentView Editor
assign _currentDemoName (Just contractDemoName)
assign _simulations $ Cursor.fromArray contractDemoSimulations
assign _simulations $ mkFullSimulation <$> Cursor.fromArray contractDemoSimulations
assign (_editorState <<< _lastCompiledCode) (Just contractDemoEditorContents)
assign (_editorState <<< _currentCodeIsCompiled) true
assign _compilationResult (Success <<< Right $ contractDemoContext)
Expand All @@ -289,12 +292,12 @@ handleAction AddSimulationSlot = do
modifying _simulations
( \simulations ->
let
maxsimulationId = fromMaybe 0 $ maximumOf (traversed <<< _simulationId) simulations
maxsimulationId = fromMaybe 0 $ maximumOf (traversed <<< _simulation <<< _simulationId) simulations

simulationId = maxsimulationId + 1
in
Cursor.snoc simulations
(mkSimulation knownCurrencies simulationId)
(mkFullSimulation $ mkSimulation knownCurrencies simulationId)
)
Nothing -> pure unit
assign _currentView Simulations
Expand All @@ -321,13 +324,13 @@ handleAction (RemoveSimulationSlot index) = do

handleAction (ModifyWallets action) = do
knownCurrencies <- getKnownCurrencies
modifying (_simulations <<< _current <<< _simulationWallets) (handleActionWalletEvent (mkSimulatorWallet knownCurrencies) action)
modifying (_simulations <<< _current <<< _simulation <<< _simulationWallets) (handleActionWalletEvent (mkSimulatorWallet knownCurrencies) action)

handleAction (ChangeSimulation subaction) = do
knownCurrencies <- getKnownCurrencies
let
initialValue = mkInitialValue knownCurrencies zero
modifying (_simulations <<< _current <<< _simulationActions) (handleSimulationAction initialValue subaction)
modifying (_simulations <<< _current <<< _simulation <<< _simulationActions) (handleSimulationAction initialValue subaction)

handleAction (ChainAction subaction) = do
mAnnotatedBlockchain <-
Expand Down Expand Up @@ -383,7 +386,7 @@ handleAction CompileProgram = do
)
( assign _simulations
$ case newCurrencies of
Just currencies -> Cursor.singleton $ mkSimulation currencies 1
Just currencies -> Cursor.singleton $ mkFullSimulation $ mkSimulation currencies 1
Nothing -> Cursor.empty
)
pure unit
Expand Down Expand Up @@ -411,7 +414,7 @@ handleGistAction PublishOrUpdateGist = do
$ runMaybeT do
mContents <- lift $ editorGetContents
simulations <- use _simulations
newGist <- hoistMaybe $ mkNewGist { source: mContents, simulations }
newGist <- hoistMaybe $ mkNewGist { source: mContents, simulations: _.simulation <$> simulations }
mGist <- use _createGistResult
assign _createGistResult Loading
newResult <-
Expand Down Expand Up @@ -456,7 +459,7 @@ handleGistAction LoadGist =
-- Load the simulation, if available.
simulationString <- noteT "Simulation not found in gist." $ view simulationGistFile gist
simulations <- except $ lmap printJsonDecodeError $ parseDecodeJson simulationString
assign _simulations simulations
assign _simulations $ mkFullSimulation <$> simulations
where
toEither :: forall e a. Either e a -> RemoteData e a -> Either e a
toEither _ (Success a) = Right a
Expand Down
12 changes: 8 additions & 4 deletions plutus-playground-client/src/MainFrame/Types.purs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ module MainFrame.Types
, WebData
, WebCompilationResult
, WebEvaluationResult
, FullSimulation
, SimulatorAction
, Query
, HAction(..)
Expand Down Expand Up @@ -54,14 +55,11 @@ newtype State
, editorState :: Editor.State
, compilationResult :: WebCompilationResult
, lastSuccessfulCompilationResult :: Maybe CompilationResult
, simulations :: Cursor Simulation
, simulations :: Cursor FullSimulation
, actionDrag :: Maybe Int
, evaluationResult :: WebEvaluationResult
, lastEvaluatedSimulation :: Maybe Simulation
, authStatus :: WebData AuthStatus
, createGistResult :: WebData Gist
, gistUrl :: Maybe String
, blockchainVisualisationState :: Chain.State
}

derive instance newtypeState :: Newtype State _
Expand Down Expand Up @@ -98,6 +96,12 @@ type WebCompilationResult
type WebEvaluationResult
= WebData (Either PlaygroundError EvaluationResult)

type FullSimulation
= { simulation :: Simulation
, blockchainVisualisationState :: Chain.State
, evaluationResult :: WebEvaluationResult
}

-- this synonym is defined in playground-common/src/Playground/Types.hs
type SimulatorAction
= ContractCall FormArgument
Expand Down
Loading