Использование tripenny-gui/ реактивного в клиент-серверном программировании

Я пытаюсь понять, как использовать Haskell Threepenny-GUI с его реактивной функциональностью, чтобы написать программу, которая позволяет

  • пользователь выбирает элемент из списка
  • отправить выбор на внешний сервер
  • получить список результатов с сервера
  • заполнить список с результатами
  • повторение

Кажется, мне нужно будет использовать Handler, newEvent а также register чтобы сделать выше. Если бы кто-то мог указать мне на какой-то существующий код, который делает что-то вроде вышеупомянутого, это было бы здорово.

Ближайшее, что я нашел, это GameThing.hs в трехпенни-гуй samples каталог (но он не использует register).

ОБНОВИТЬ:

Я спрашиваю, должен ли я использовать Handler, newEvent а также register --- и, если да, некоторые пояснения или пример этих функций.

Кроме того, чтобы быть ясным, общая картина:

browser  --> threepenny-gui (on localhost) --> backend server (anywhere on network)
         <--                               <--

Другими словами, мне нужно сделать IO (на основе выбора пользователя), а затем отобразить результаты этого IO.

ОБНОВЛЕНИЕ: вот мое решение (на основе ответа @ Талдыкина): https://github.com/haroldcarr/rdf-triple-browser/tree/master/haskell/src

1 ответ

Решение

Вот кусок кода. Я добавлю описание чуть позже.

{-# LANGUAGE LambdaCase #-}
import Graphics.UI.Threepenny as UI


main :: IO ()
main = do
  (evFillList, doFillList) <- newEvent
  initialList <- valuesSupply ""
  behFillList <- stepper initialList evFillList

  startGUI defaultConfig $ \win -> do
    list <- ul
    sel <- listBox
        behFillList
        (pure Nothing)
        (pure $ \it -> UI.span # set text it)

    getBody win #+ [grid [[element list, element sel]]]
    setFocus $ getElement sel

    on selectionChange (getElement sel) $ \case
      Nothing -> return ()
      Just ix -> do
        items <- currentValue behFillList
        let it = items !! ix
        liftIO $ valuesSupply it >>= doFillList
        element list #+ [li # set html it]
        setFocus $ getElement sel


valuesSupply :: String -> IO [String]
valuesSupply x = return [x ++ show i | i <- [0..9]]
Другие вопросы по тегам