-----------------------------------------------------------------------------
{-# LANGUAGE OverloadedStrings #-}
-----------------------------------------------------------------------------
-- |
-- Module      :  Miso.Flow.Utils.Connections
-- License     :  BSD3-style (see the file LICENSE)
--
-- Pure port of @utils\/connections.ts@ from @\@xyflow\/system@.
----------------------------------------------------------------------------
module Miso.Flow.Utils.Connections
  ( areConnectionMapsEqual
  , handleConnectionChange
  , getConnectionStatus
  ) where
-----------------------------------------------------------------------------
import           Data.Map.Strict (Map)
import qualified Data.Map.Strict as M
import           Prelude
-----------------------------------------------------------------------------
import           Miso.String (MisoString)
-----------------------------------------------------------------------------
import           Miso.Flow.Types
-----------------------------------------------------------------------------
-- | Two connection maps hold the same connection keys.
areConnectionMapsEqual
  :: Maybe (Map MisoString HandleConnection)
  -> Maybe (Map MisoString HandleConnection)
  -> Bool
areConnectionMapsEqual :: Maybe (Map MisoString HandleConnection)
-> Maybe (Map MisoString HandleConnection) -> Bool
areConnectionMapsEqual Maybe (Map MisoString HandleConnection)
Nothing Maybe (Map MisoString HandleConnection)
Nothing = Bool
True
areConnectionMapsEqual (Just Map MisoString HandleConnection
a) (Just Map MisoString HandleConnection
b)
  | Map MisoString HandleConnection -> Int
forall k a. Map k a -> Int
M.size Map MisoString HandleConnection
a Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
/= Map MisoString HandleConnection -> Int
forall k a. Map k a -> Int
M.size Map MisoString HandleConnection
b = Bool
False
  | Map MisoString HandleConnection -> Bool
forall k a. Map k a -> Bool
M.null Map MisoString HandleConnection
a Bool -> Bool -> Bool
&& Map MisoString HandleConnection -> Bool
forall k a. Map k a -> Bool
M.null Map MisoString HandleConnection
b = Bool
True
  | Bool
otherwise = (MisoString -> Bool) -> [MisoString] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (MisoString -> Map MisoString HandleConnection -> Bool
forall k a. Ord k => k -> Map k a -> Bool
`M.member` Map MisoString HandleConnection
b) (Map MisoString HandleConnection -> [MisoString]
forall k a. Map k a -> [k]
M.keys Map MisoString HandleConnection
a)
areConnectionMapsEqual Maybe (Map MisoString HandleConnection)
_ Maybe (Map MisoString HandleConnection)
_ = Bool
False
-----------------------------------------------------------------------------
-- | Connections in @a@ that are not in @b@ (used to fire
-- connect\/disconnect callbacks).
handleConnectionChange
  :: Map MisoString HandleConnection
  -> Map MisoString HandleConnection
  -> [HandleConnection]
handleConnectionChange :: Map MisoString HandleConnection
-> Map MisoString HandleConnection -> [HandleConnection]
handleConnectionChange Map MisoString HandleConnection
a Map MisoString HandleConnection
b =
  [ HandleConnection
c | (MisoString
k, HandleConnection
c) <- Map MisoString HandleConnection -> [(MisoString, HandleConnection)]
forall k a. Map k a -> [(k, a)]
M.toList Map MisoString HandleConnection
a, Bool -> Bool
not (MisoString
k MisoString -> Map MisoString HandleConnection -> Bool
forall k a. Ord k => k -> Map k a -> Bool
`M.member` Map MisoString HandleConnection
b) ]
-----------------------------------------------------------------------------
-- | @\'valid\'@ \/ @\'invalid\'@ status string for an ongoing connection.
getConnectionStatus :: Maybe Bool -> Maybe MisoString
getConnectionStatus :: Maybe Bool -> Maybe MisoString
getConnectionStatus = \case
  Maybe Bool
Nothing -> Maybe MisoString
forall a. Maybe a
Nothing
  Just Bool
True -> MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just MisoString
"valid"
  Just Bool
False -> MisoString -> Maybe MisoString
forall a. a -> Maybe a
Just MisoString
"invalid"
-----------------------------------------------------------------------------