Использование 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]]