Как объединить два сигнала с SampleOn в Elm
Я пытаюсь объединить два сигнала. Один из них - Mouse.clicks, а другой - Keyboard.space.
- На клики, я должен получить сигнал (Int,Int) от Mouse.position в качестве возвращаемого значения
- В космосе я должен получить что-то другое, чтобы я мог определить, сработал ли другой сигнал.
Моя идея такова:
type Event = Click | Space
mergedSignal : Signal Event
mergedSignal =
let
clickSignal = map (\event -> Click) Mouse.clicks
timeoutSignal = map (\event -> Space) Keyboard.space
in
merge clickSignal timeoutSignal
и получить положение как-то:
positionOnClickSignal:Signal (Int,Int)
positionOnClickSignal = sampleOn Mouse.clicks Mouse.position
Очевидно, это неправильно.
1 ответ
Звучит так, будто вы хотите, чтобы положение мыши переносилось как часть события. В этом случае вы можете переопределить Event
как
type Event
= Click (Int, Int)
| Space
Внутри вашего mergedSignal
, clickSignal
в настоящее время просто проверяет Mouse.clicks
но на основании вашего описания и другого примера, я думаю, вы действительно хотите, чтобы это было основано на positionOnclickSignal
, который дает вам Signal (Int, Int)
и, используя это, теперь вы можете заполнить (Int, Int)
часть Click (Int, Int)
событие как это:
clickSignal =
map Click positionOnClickSignal
Вы заметите, что я вынул скобки в вышеупомянутом. Это более идиоматично для Вяза, потому что Click
по сути это функция, которая занимает один (Int, Int)
параметр, который будет передан из функции карты. Это можно было бы легко написать так:
clickSignal =
map (\pos -> Click pos) positionOnClickSignal
Теперь, если вы просто пытаетесь увидеть отладочный текст этого на экране, быстрый и простой способ сделать это - использовать show
от Graphics.Element
пакет.
import Graphics.Element exposing (show)
main =
map (show << toString) mergedSignal
Это даст вам некоторый отладочный текст, показанный как единственное на странице, и вы можете легко добавить его на http://elm-lang.org/try для тестирования.