{-# LANGUAGE CPP #-}
module WeekDaze.Data.Resource(
Resource(..),
ResourceMap,
countDaysPerWeekAvailable,
isAvailable,
extractAvailableResources
) where
import qualified Data.Foldable
import qualified Data.Functor
import qualified Data.Map
import qualified Data.Set
import qualified WeekDaze.Size as Size
import qualified WeekDaze.Temporal.Availability as Temporal.Availability
import qualified WeekDaze.Temporal.Day as Temporal.Day
class Resource resource where
getAvailability :: resource -> Temporal.Availability.Availability
isAvailableOn :: Temporal.Day.Day -> resource -> Bool
isAvailableOn day = Temporal.Availability.isAvailableOn day . getAvailability
countDaysPerWeekAvailable :: Resource resource => resource -> Size.NDays
countDaysPerWeekAvailable = Temporal.Availability.countDaysPerWeekAvailable . getAvailability
isAvailable :: Resource resource => resource -> Bool
isAvailable = not . Temporal.Availability.isUnavailable . getAvailability
findCommonAvailability :: (Data.Foldable.Foldable f, Data.Functor.Functor f, Resource resource) => f resource -> Temporal.Availability.Availability
findCommonAvailability = Temporal.Availability.findIntersections . fmap getAvailability
instance Resource resource => Resource [resource] where
getAvailability = findCommonAvailability
isAvailableOn day = all (isAvailableOn day)
instance Resource resource => Resource (Data.Map.Map k resource) where
getAvailability = findCommonAvailability
isAvailableOn day = Data.Foldable.all (isAvailableOn day)
instance (
#if !MIN_VERSION_containers(0,5,2)
Ord resource,
#endif
Resource resource
) => Resource (Data.Set.Set resource) where
getAvailability = Temporal.Availability.findIntersections . Data.Set.map getAvailability
isAvailableOn day = Data.Foldable.all (isAvailableOn day)
instance (Resource a, Resource b) => Resource (a, b) where
getAvailability (x, y) = getAvailability x `Temporal.Availability.findIntersection` getAvailability y
isAvailableOn day (x, y) = all (Temporal.Availability.isAvailableOn day) [getAvailability x, getAvailability y]
instance (Resource a, Resource b, Resource c) => Resource (a, b, c) where
getAvailability (x, y, z) = Temporal.Availability.findIntersections [getAvailability x, getAvailability y, getAvailability z]
isAvailableOn day (x, y, z) = all (Temporal.Availability.isAvailableOn day) [getAvailability x, getAvailability y, getAvailability z]
type ResourceMap resourceId resource = Data.Map.Map resourceId resource
extractAvailableResources :: Resource resource => Temporal.Day.Day -> ResourceMap resourceId resource -> ResourceMap resourceId resource
extractAvailableResources day = Data.Map.filter (isAvailableOn day)