Skip to content

Commit

Permalink
Store evaluation with its simulation (#155)
Browse files Browse the repository at this point in the history
* Store evaluation with its simulation

* Remove release banner

* Rename Blocks to Slots
  • Loading branch information
sjoerdvisscher authored Dec 1, 2021
1 parent 2d73942 commit ad40233
Show file tree
Hide file tree
Showing 7 changed files with 132 additions and 123 deletions.
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

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
) 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

0 comments on commit ad40233

Please sign in to comment.