Skip to content

Commit 147f331

Browse files
committed
Per-exercise setting
1 parent 6f280c0 commit 147f331

File tree

4 files changed

+59
-8
lines changed

4 files changed

+59
-8
lines changed

src/web/exercises/TheoremExerciseSpec.re

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,5 @@ type t = {
88
prelude: Haz3lcore.Zipper.t,
99
lemmas: Haz3lcore.Zipper.t,
1010
theorem: Haz3lcore.Zipper.t,
11+
write_out_steps: bool,
1112
};

src/web/exercises/examples/ReverseReverse.ml

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/web/exercises/examples/TheoremTemplate.ml

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/web/view/TheoremExerciseMode.re

Lines changed: 56 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ module Model = {
2121
title: string,
2222
prompt: string,
2323
cells,
24+
write_out_steps: bool,
2425
};
2526

2627
[@deriving (show({with_path: false}), sexp, yojson)]
@@ -48,6 +49,7 @@ module Model = {
4849
result: persistent.theorem |> EvalResult.Model.unpersist,
4950
},
5051
},
52+
write_out_steps: spec.write_out_steps,
5153
};
5254
};
5355

@@ -61,6 +63,7 @@ module Model = {
6163
lemmas: CellEditor.Model.mk(Editor.Model.mk(spec.lemmas)),
6264
theorem: CellEditor.Model.mk(Editor.Model.mk(spec.theorem)),
6365
},
66+
write_out_steps: spec.write_out_steps,
6467
};
6568
};
6669

@@ -72,6 +75,7 @@ module Model = {
7275
prelude: model.cells.prelude.editor.editor.state.zipper,
7376
lemmas: model.cells.lemmas.editor.editor.state.zipper,
7477
theorem: model.cells.theorem.editor.editor.state.zipper,
78+
write_out_steps: model.write_out_steps,
7579
};
7680
};
7781

@@ -83,18 +87,46 @@ module Model = {
8387
};
8488
};
8589

90+
let override_core_settings =
91+
(settings: Language.CoreSettings.t, model: Model.t) => {
92+
{
93+
...settings,
94+
evaluation: {
95+
...settings.evaluation,
96+
write_out_steps:
97+
model.write_out_steps || settings.evaluation.write_out_steps,
98+
},
99+
};
100+
};
101+
102+
let override_settings = (settings: Settings.t, model: Model.t) => {
103+
{
104+
...settings,
105+
core: override_core_settings(settings.core, model),
106+
};
107+
};
108+
109+
let override_globals = (globals: Globals.t, model: Model.t) => {
110+
{
111+
...globals,
112+
settings: override_settings(globals.settings, model),
113+
};
114+
};
115+
86116
module Update = {
87117
open Updated;
88118

89119
[@deriving (show({with_path: false}), sexp, yojson)]
90120
type t =
91121
| UpdateTitle(string)
92122
| UpdatePrompt(string)
123+
| ToggleWriteOutSteps
93124
| Prelude(CellEditor.Update.t)
94125
| Lemmas(CellEditor.Update.t)
95126
| Theorem(CellEditor.Update.t);
96127

97128
let update = (~settings: Settings.t, action: t, model: Model.t) => {
129+
let settings = override_settings(settings, model);
98130
switch (action) {
99131
| UpdateTitle(new_title) when settings.instructor_mode =>
100132
Updated.return({
@@ -112,6 +144,14 @@ module Update = {
112144
| UpdatePrompt(_) =>
113145
print_endline("Instructor-only action");
114146
Updated.return_quiet(model);
147+
| ToggleWriteOutSteps when settings.instructor_mode =>
148+
Updated.return({
149+
...model,
150+
write_out_steps: !model.write_out_steps,
151+
})
152+
| ToggleWriteOutSteps =>
153+
print_endline("Instructor-only action");
154+
Updated.return_quiet(model);
115155
| Prelude(action) when settings.instructor_mode =>
116156
let* new_cell =
117157
CellEditor.Update.update(~settings, action, model.cells.prelude);
@@ -199,6 +239,7 @@ module Update = {
199239
switch (action) {
200240
| UpdateTitle(_) => true
201241
| UpdatePrompt(_) => true
242+
| ToggleWriteOutSteps => true
202243
| Prelude(action) => CellEditor.Update.can_undo(action)
203244
| Lemmas(action) => CellEditor.Update.can_undo(action)
204245
| Theorem(action) => CellEditor.Update.can_undo(action)
@@ -207,6 +248,7 @@ module Update = {
207248

208249
let calculate =
209250
(~settings, ~is_edited, ~schedule_action, model: Model.t): Model.t => {
251+
let settings = override_core_settings(settings, model);
210252
// Work out the terms
211253
let just_prelude_term =
212254
MakeTerm.from_zip_for_sem(
@@ -441,6 +483,7 @@ module View = {
441483
~selection: option(Selection.t),
442484
model: Model.t,
443485
) => {
486+
let globals = override_globals(globals, model);
444487
let title_view =
445488
CellCommon.simple_cell_view([
446489
div(
@@ -471,6 +514,16 @@ module View = {
471514
),
472515
]);
473516

517+
let write_out_steps_view =
518+
CellCommon.simple_cell_view([
519+
text("Force writing out proof steps:"),
520+
Widgets.toggle_named("", model.write_out_steps, _ =>
521+
inject(Update.ToggleWriteOutSteps)
522+
),
523+
]);
524+
let write_out_steps_view =
525+
globals.settings.instructor_mode ? [write_out_steps_view] : [];
526+
474527
let prompt_view =
475528
CellCommon.simple_cell_view([
476529
globals.settings.instructor_mode
@@ -542,13 +595,8 @@ module View = {
542595
|> Option.value(~default=(Float.nan, Float.nan)),
543596
);
544597

545-
[
546-
score_view,
547-
title_view,
548-
prompt_view,
549-
prelude_view,
550-
lemmas_view,
551-
theorem_view,
552-
];
598+
[score_view, title_view]
599+
@ write_out_steps_view
600+
@ [prompt_view, prelude_view, lemmas_view, theorem_view];
553601
};
554602
};

0 commit comments

Comments
 (0)