module System.Mesos.Resources where
import Control.Lens
import Data.ByteString (ByteString)
import Data.List (find, foldl', groupBy)
import Data.Word
import System.Mesos.Types
newtype Resources = Resources { fromResources :: [Resource] }
deriving (Eq, Show)
instance Wrapped Resources where
type Unwrapped Resources = [Resource]
_Wrapped' = iso fromResources Resources
instance (t ~ Resources) => Rewrapped Resources t
instance Ord Resources where
sub <= super = foldl' go True lgs
where
lgs = groupBy (\x y -> resourceName x == resourceName y) $ fromResources sub
rgs = groupBy (\x y -> resourceName x == resourceName y) $ fromResources super
go b res = case find (\x -> (res ^? traverse . to resourceName) == (x ^? traverse . to resourceName)) rgs of
Nothing -> False
Just gs -> b && (sumOf (traverse . value . scalar) res <= sumOf (traverse . value . scalar) gs)
value :: Lens' Resource Value
value = lens resourceValue $ \r v -> r { resourceValue = v }
scalar :: Prism' Value Double
scalar = prism' Scalar $ \x -> case x of
Scalar d -> Just d
_ -> Nothing
ranges :: Prism' Value [(Word64, Word64)]
ranges = prism' Ranges $ \x -> case x of
Ranges rs -> Just rs
_ -> Nothing
set :: Prism' Value [ByteString]
set = prism' Set $ \x -> case x of
Set bs -> Just bs
_ -> Nothing
text :: Prism' Value ByteString
text = prism' Text $ \x -> case x of
Text t -> Just t
_ -> Nothing
cpus :: Prism' Resource Double
cpus = prism' (\x -> Resource "cpus" (Scalar x) (Just "*")) $ \r ->
if resourceName r == "cpus"
then r ^? value . scalar
else Nothing
mem :: Prism' Resource Double
mem = prism' (\x -> Resource "mem" (Scalar x) (Just "*")) $ \r ->
if resourceName r == "mem"
then r ^? value . scalar
else Nothing
disk :: Prism' Resource Double
disk = prism' (\x -> Resource "disk" (Scalar x) (Just "*")) $ \r ->
if resourceName r == "disk"
then r ^? value . scalar
else Nothing
ports :: Prism' Resource [(Word64, Word64)]
ports = prism' (\x -> Resource "ports" (Ranges x) (Just "*")) $ \r ->
if resourceName r == "ports"
then r ^? value . ranges
else Nothing
flattened :: Getter [Resource] [Resource]
flattened = undefined