module Ecluse.Core.Server.Readiness (
DatabaseRequirement (..),
MountReadiness (..),
mountStateFor,
Readiness (..),
mountReadiness,
alwaysReady,
routable,
allMountsReady,
) where
import Data.Map.Strict qualified as Map
import Ecluse.Core.Ecosystem (Ecosystem)
data DatabaseRequirement
= DatabaseRequired
| DatabaseOptional
deriving stock (DatabaseRequirement -> DatabaseRequirement -> Bool
(DatabaseRequirement -> DatabaseRequirement -> Bool)
-> (DatabaseRequirement -> DatabaseRequirement -> Bool)
-> Eq DatabaseRequirement
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: DatabaseRequirement -> DatabaseRequirement -> Bool
== :: DatabaseRequirement -> DatabaseRequirement -> Bool
$c/= :: DatabaseRequirement -> DatabaseRequirement -> Bool
/= :: DatabaseRequirement -> DatabaseRequirement -> Bool
Eq, Int -> DatabaseRequirement -> ShowS
[DatabaseRequirement] -> ShowS
DatabaseRequirement -> String
(Int -> DatabaseRequirement -> ShowS)
-> (DatabaseRequirement -> String)
-> ([DatabaseRequirement] -> ShowS)
-> Show DatabaseRequirement
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> DatabaseRequirement -> ShowS
showsPrec :: Int -> DatabaseRequirement -> ShowS
$cshow :: DatabaseRequirement -> String
show :: DatabaseRequirement -> String
$cshowList :: [DatabaseRequirement] -> ShowS
showList :: [DatabaseRequirement] -> ShowS
Show)
data MountReadiness
= MountReady
| MountAwaitingFirstSync
deriving stock (MountReadiness -> MountReadiness -> Bool
(MountReadiness -> MountReadiness -> Bool)
-> (MountReadiness -> MountReadiness -> Bool) -> Eq MountReadiness
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: MountReadiness -> MountReadiness -> Bool
== :: MountReadiness -> MountReadiness -> Bool
$c/= :: MountReadiness -> MountReadiness -> Bool
/= :: MountReadiness -> MountReadiness -> Bool
Eq, Int -> MountReadiness -> ShowS
[MountReadiness] -> ShowS
MountReadiness -> String
(Int -> MountReadiness -> ShowS)
-> (MountReadiness -> String)
-> ([MountReadiness] -> ShowS)
-> Show MountReadiness
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> MountReadiness -> ShowS
showsPrec :: Int -> MountReadiness -> ShowS
$cshow :: MountReadiness -> String
show :: MountReadiness -> String
$cshowList :: [MountReadiness] -> ShowS
showList :: [MountReadiness] -> ShowS
Show)
mountStateFor :: DatabaseRequirement -> Bool -> MountReadiness
mountStateFor :: DatabaseRequirement -> Bool -> MountReadiness
mountStateFor DatabaseRequirement
requirement Bool
synced = case DatabaseRequirement
requirement of
DatabaseRequirement
DatabaseOptional -> MountReadiness
MountReady
DatabaseRequirement
DatabaseRequired -> MountReadiness -> MountReadiness -> Bool -> MountReadiness
forall a. a -> a -> Bool -> a
bool MountReadiness
MountAwaitingFirstSync MountReadiness
MountReady Bool
synced
data Readiness
=
Routable (Map.Map Ecosystem MountReadiness)
|
AwaitingMounts (Map.Map Ecosystem MountReadiness)
|
Latched
deriving stock (Readiness -> Readiness -> Bool
(Readiness -> Readiness -> Bool)
-> (Readiness -> Readiness -> Bool) -> Eq Readiness
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Readiness -> Readiness -> Bool
== :: Readiness -> Readiness -> Bool
$c/= :: Readiness -> Readiness -> Bool
/= :: Readiness -> Readiness -> Bool
Eq, Int -> Readiness -> ShowS
[Readiness] -> ShowS
Readiness -> String
(Int -> Readiness -> ShowS)
-> (Readiness -> String)
-> ([Readiness] -> ShowS)
-> Show Readiness
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Readiness -> ShowS
showsPrec :: Int -> Readiness -> ShowS
$cshow :: Readiness -> String
show :: Readiness -> String
$cshowList :: [Readiness] -> ShowS
showList :: [Readiness] -> ShowS
Show)
mountReadiness :: Map.Map Ecosystem MountReadiness -> Readiness
mountReadiness :: Map Ecosystem MountReadiness -> Readiness
mountReadiness Map Ecosystem MountReadiness
mounts
| Map Ecosystem MountReadiness -> Bool
forall k a. Map k a -> Bool
Map.null Map Ecosystem MountReadiness
mounts Bool -> Bool -> Bool
|| MountReadiness
MountReady MountReadiness -> [MountReadiness] -> Bool
forall (f :: * -> *) a.
(Foldable f, DisallowElem f, Eq a) =>
a -> f a -> Bool
`elem` Map Ecosystem MountReadiness -> [MountReadiness]
forall k a. Map k a -> [a]
Map.elems Map Ecosystem MountReadiness
mounts = Map Ecosystem MountReadiness -> Readiness
Routable Map Ecosystem MountReadiness
mounts
| Bool
otherwise = Map Ecosystem MountReadiness -> Readiness
AwaitingMounts Map Ecosystem MountReadiness
mounts
alwaysReady :: Readiness
alwaysReady :: Readiness
alwaysReady = Map Ecosystem MountReadiness -> Readiness
mountReadiness Map Ecosystem MountReadiness
forall k a. Map k a
Map.empty
routable :: Readiness -> Bool
routable :: Readiness -> Bool
routable = \case
Routable Map Ecosystem MountReadiness
_ -> Bool
True
AwaitingMounts Map Ecosystem MountReadiness
_ -> Bool
False
Readiness
Latched -> Bool
False
allMountsReady :: Readiness -> Bool
allMountsReady :: Readiness -> Bool
allMountsReady = \case
Routable Map Ecosystem MountReadiness
mounts -> (MountReadiness -> Bool) -> [MountReadiness] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (MountReadiness -> MountReadiness -> Bool
forall a. Eq a => a -> a -> Bool
== MountReadiness
MountReady) (Map Ecosystem MountReadiness -> [MountReadiness]
forall k a. Map k a -> [a]
Map.elems Map Ecosystem MountReadiness
mounts)
AwaitingMounts Map Ecosystem MountReadiness
_ -> Bool
False
Readiness
Latched -> Bool
False