packages feed

experimenter-0.1.0.0: src/Experimenter/Availability/Ops.hs

{-# LANGUAGE BangPatterns              #-}
{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE GADTs                     #-}

module Experimenter.Availability.Ops where

import           Experimenter.Availability.Type

import           Conduit                        as C
import           Data.Conduit.List              as CL

import           Experimenter.DB

mkAvailable :: (Monad m) => Availability m b -> DB m (Availability m b)
mkAvailable (AvailableOnDemand query) = Available <$> query
mkAvailable (Available x)             = return (Available x)

mkTransientlyAvailable :: (Monad m) => Availability m b -> DB m b
mkTransientlyAvailable (Available x)             = return x
mkTransientlyAvailable (AvailableOnDemand query) = query

mkAvailableList :: (Monad m) => AvailabilityList m b -> DB m (AvailabilityList m b)
mkAvailableList (AvailableList (nr, xs) src)       = return $ AvailableList (nr, xs) src
mkAvailableList (AvailableListOnDemand (_, query)) = (\xs -> AvailableList (length xs, xs) query) <$> C.runConduit (query GetAll C..| CL.consume)

mkTransientlyAvailableList :: (Monad m) => AvailabilityList m b -> DB m [b]
mkTransientlyAvailableList (AvailableList (_,x) _)             = return x
mkTransientlyAvailableList (AvailableListOnDemand (_,query)) = C.runConduit $ query GetAll C..| CL.consume

lengthAvailabilityList :: AvailabilityList m b -> Int
lengthAvailabilityList (AvailableList (nr, _) _)       = nr
lengthAvailabilityList (AvailableListOnDemand (nr, _)) = nr

srcAvailableList :: (Monad m) => AvailabilityList m a -> ConduitT () a (DB m) ()
srcAvailableList (AvailableList (_, xs) _)       = CL.sourceList xs
srcAvailableList (AvailableListOnDemand (_,src)) = src GetAll

srcAvailableListWhere :: AvailabilityListWhere -> AvailabilityList m a -> ConduitT () a (DB m) ()
srcAvailableListWhere where' (AvailableList _ src)           = src where'
srcAvailableListWhere where' (AvailableListOnDemand (_,src)) = src where'