-- |
-- random helper methods, nothing to see here
-- the only reason this is exposed is so I can use this in tests
-- if you find any of these useful and want more please see the same file in https://github.com/pdlla/potato-flow
{-# LANGUAGE RecursiveDo #-}
module Reflex.Potato.Helpers
( leftmostwarn
, fanDSum
, foldDynMergeWith
, getLeft
, getRight
, getHere
, getThere
)
where
import Relude
import Reflex
import Control.Monad.Fix
import qualified Data.Dependent.Map as DM
import qualified Data.Dependent.Sum as DS
import Data.Wedge
-- | same as leftmost but outputs a warning if more than one event fires at once
leftmostwarn :: (Reflex t) => String -> [Event t a] -> Event t a
leftmostwarn label evs = r where
combine = mergeList evs
nowarn =
fmapMaybe (\x -> if length x == 1 then Just (head x) else Nothing) combine
warn =
traceEventWith
(const ("WARNING: multiple " <> label <> " events triggered"))
$ fmapMaybe (\x -> if length x > 1 then Just (head x) else Nothing)
combine
r = leftmost [nowarn, warn]
fanDSum
:: forall t k
. (Reflex t, DM.GCompare k)
=> Event t (DS.DSum k Identity)
-> EventSelector t k
fanDSum ds = fan $ DM.fromAscList . (: []) <$> ds
foldDynMergeWith
:: (Reflex t, MonadHold t m, MonadFix m)
=> b -- ^ initial value of dynamic
-> [Event t (b -> b)] -- ^ list of events producing a reducing method
-> m (Dynamic t b) -- ^ final output after all folding methods applied
foldDynMergeWith acc = foldDyn ($) acc . mergeWith (.)
getLeft :: Either a b -> Maybe a
getLeft (Left x) = Just x
getLeft _ = Nothing
getRight :: Either a b -> Maybe b
getRight (Right x) = Just x
getRight _ = Nothing
-- my additions
getHere :: Wedge a b -> Maybe a
getHere c = case c of
Here x -> Just x
_ -> Nothing
getThere :: Wedge a b -> Maybe b
getThere c = case c of
There x -> Just x
_ -> Nothing