Как объединить два сигнала с 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 для тестирования.

Другие вопросы по тегам