Add status script code ideas
This commit is contained in:
parent
52bc741dcf
commit
5837226fb1
1 changed files with 59 additions and 0 deletions
|
@ -308,3 +308,62 @@ processNotifications =
|
||||||
notificationBlockList = ["Automatic suspend", "Auto suspend"]
|
notificationBlockList = ["Automatic suspend", "Auto suspend"]
|
||||||
|
|
||||||
diffIsSmall = \pathA pathB -> (== "[]") <$> (nix_diff "--json" [pathA, pathB] |> jq ".inputsDiff.inputDerivationDiffs" |> captureTrim)
|
diffIsSmall = \pathA pathB -> (== "[]") <$> (nix_diff "--json" [pathA, pathB] |> jq ".inputsDiff.inputDerivationDiffs" |> captureTrim)
|
||||||
|
|
||||||
|
{-
|
||||||
|
import Data.IntMap.Strict qualified as IntMap
|
||||||
|
import Effectful (Eff, IOE, (:>))
|
||||||
|
import Effectful qualified as Eff
|
||||||
|
import Relude
|
||||||
|
import Streamly.Data.Fold qualified as Fold
|
||||||
|
import Streamly.Data.Stream.Prelude (Stream, MonadAsync)
|
||||||
|
import Streamly.Data.Stream.Prelude qualified as Stream
|
||||||
|
import Streamly.Internal.Data.Stream.Time qualified as Time
|
||||||
|
import Prelude ()
|
||||||
|
import Control.Monad.Catch (MonadCatch)
|
||||||
|
|
||||||
|
type SEff es a = Stream (Eff es) a
|
||||||
|
|
||||||
|
sourceEvent :: IOE :> es => SEff es Int
|
||||||
|
sourceEvent =
|
||||||
|
Time.ticks 1
|
||||||
|
& Stream.indexed
|
||||||
|
& fmap fst
|
||||||
|
|
||||||
|
-- | Drain first stream exactly once, second stream as often as you want!
|
||||||
|
mirrorStream :: (MonadAsync m, MonadCatch m) => Stream m a -> m (Stream m a, Stream m a)
|
||||||
|
mirrorStream stream = do
|
||||||
|
emiters <- newIORef []
|
||||||
|
pure
|
||||||
|
( stream
|
||||||
|
& Stream.finally
|
||||||
|
( do
|
||||||
|
emiters' <- readIORef emiters
|
||||||
|
forM_ emiters' \emiter -> emiter Nothing
|
||||||
|
)
|
||||||
|
& Stream.parMapM
|
||||||
|
id
|
||||||
|
( \x -> do
|
||||||
|
emiters' <- readIORef emiters
|
||||||
|
forM_ emiters' \emiter -> emiter (Just x)
|
||||||
|
pure x
|
||||||
|
)
|
||||||
|
, Stream.fromCallback (\emit -> modifyIORef' emiters (emit :)) & Stream.takeWhile isJust & Stream.catMaybes
|
||||||
|
)
|
||||||
|
|
||||||
|
mkModules :: IOE :> es => [SEff es (Maybe a)] -> SEff es (IntMap a)
|
||||||
|
mkModules modules =
|
||||||
|
Stream.parList id (zipWith (\i m -> (\new_value -> IntMap.alter (const new_value) i) <$> m) [0 ..] modules)
|
||||||
|
& Stream.scan (Fold.foldl' (&) IntMap.empty)
|
||||||
|
& Stream.sampleIntervalEnd 0.05
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main =
|
||||||
|
Eff.runEff $ Eff.withUnliftStrategy (Eff.ConcUnlift Eff.Persistent Eff.Unlimited) do
|
||||||
|
(origStream, mirroredStream) <- mirrorStream sourceEvent
|
||||||
|
let eventA = origStream <&> \x -> Just ("A: " <> show x)
|
||||||
|
eventB = mirroredStream <&> \x -> Just ("B: " <> show x)
|
||||||
|
eventC = mirroredStream <&> \x -> Just ("C: " <> show x)
|
||||||
|
mkModules [eventA, eventB, eventC]
|
||||||
|
& Stream.mapM (putTextLn . show)
|
||||||
|
& Stream.fold Fold.drain
|
||||||
|
-}
|
||||||
|
|
Loading…
Reference in a new issue