Skip to content

Commit

Permalink
Add next, prev, and shuffle.
Browse files Browse the repository at this point in the history
  • Loading branch information
abadi199 committed Apr 1, 2020
1 parent 696595e commit 9edd4c1
Show file tree
Hide file tree
Showing 8 changed files with 570 additions and 2 deletions.
28 changes: 26 additions & 2 deletions __tests__/Word_test.re
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ describe("Word", () => {
expect([m, a, t] |> Word.toString) |> toBe("m,a,t")
);

test("toString(qu,i,c,k)", () =>
expect([qu, i, c, k] |> Word.toString) |> toBe("qu,i,c,k")
test("toString(qu,i,ck)", () =>
expect([qu, i, ck] |> Word.toString) |> toBe("qu,i,ck")
);
});

Expand All @@ -23,4 +23,28 @@ describe("Word", () => {
expect("qu,i,c,k" |> Word.fromString) |> toEqual([qu, i, c, k])
);
});

describe("findPrev", () => {
Expect.(
test("findPrev", () =>
expect(
Word.findPrev([[m, a, t], [qu, i, ck]], [qu, i, ck])
->Belt.Option.map(Word.toString),
)
|> toEqual(Some("m,a,t"))
)
)
});

describe("findNext", () => {
Expect.(
test("findNext", () =>
expect(
Word.findNext([[m, a, t], [qu, i, ck]], [m, a, t])
->Belt.Option.map(Word.toString),
)
|> toEqual(Some("qu,i,ck"))
)
)
});
});
17 changes: 17 additions & 0 deletions src/Storage.re
Original file line number Diff line number Diff line change
Expand Up @@ -74,4 +74,21 @@ let deleteWord: word => list(word) =
let updatedWords = removeWord(existingWords, word);
Dom.Storage.setItem(storageKey, updatedWords, Dom.Storage.localStorage);
loadWords();
};

let prevWord: word => word =
word => {
loadWords()->findPrev(word)->Belt.Option.getWithDefault(word);
};

let nextWord: word => word =
word => {
loadWords()->findNext(word)->Belt.Option.getWithDefault(word);
};

let shuffleWord: unit => option(word) =
() => {
let words = loadWords();
let randomIndex = Random.int(List.length(words));
List.nth_opt(words, randomIndex);
};
40 changes: 40 additions & 0 deletions src/View.re
Original file line number Diff line number Diff line change
Expand Up @@ -58,10 +58,50 @@ let make = (~dispatch, ~state, ~onEditButtonClicked) => {
};
};

module Navigation = {
let prevButtonClicked = _evt => {
let word = Storage.prevWord(state.word);
dispatch(LoadWord(word));
};

let shuffleButtonClicked = _evt => {
let word =
Storage.shuffleWord()->Belt.Option.getWithDefault(state.word);
dispatch(LoadWord(word));
};

let nextButtonClicked = _evt => {
let word = Storage.nextWord(state.word);
dispatch(LoadWord(word));
};

[@react.component]
let make = () => {
<div className="navigation">
<button
className="transparent-button prev-button"
title="Next"
onClick=prevButtonClicked
/>
<button
className="transparent-button shuffle-button"
title="Next"
onClick=shuffleButtonClicked
/>
<button
className="transparent-button next-button"
title="Next"
onClick=nextButtonClicked
/>
</div>;
};
};

switch (state.display) {
| DisplayPlay =>
<div className="play">
<ViewWord word={state.word} />
<Navigation />
<ActionSection />
</div>
| DisplaySavedWords =>
Expand Down
22 changes: 22 additions & 0 deletions src/Word.re
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,28 @@ let fromString = (word: string): word => {
|> List.flatten;
};

let rec findPrev: (list(word), word) => option(word) =
(words, word) => {
let wordStr = toString(word);
switch (words) {
| [] => None
| [_] => None
| [a, b, ..._rest] when toString(b) == wordStr => Some(a)
| [_, ...rest] => findPrev(rest, word)
};
};

let rec findNext: (list(word), word) => option(word) =
(words, word) => {
let wordStr = toString(word);
switch (words) {
| [] => None
| [_] => None
| [a, b, ..._rest] when toString(a) == wordStr => Some(b)
| [_, ...rest] => findNext(rest, word)
};
};

[@react.component]
let make = (~word: word, ~onDeleteClicked=() => (), ~onClick=() => ()) => {
<div className="word" onClick={_evt => onClick()}>
Expand Down
149 changes: 149 additions & 0 deletions src/icons/arrow_back_ios-black-24dp.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading

0 comments on commit 9edd4c1

Please sign in to comment.