packages feed

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

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

module Experimenter.Availability.Type where

import           Control.DeepSeq
import           Data.Conduit
import           Database.Esqueleto  as E
import           Experimenter.Models

import           Experimenter.DB

data Availability m b
  = Available !b
  | AvailableOnDemand !(DB m b)

instance (Show b) => Show (Availability m b) where
  show (Available b)         = show b
  show (AvailableOnDemand _) = "Available on demand"

instance (NFData b) => NFData (Availability m b) where
  rnf (Available b)          = rnf b
  rnf (AvailableOnDemand !_) = ()


type AggregateFunction = E.SqlExpr (E.Value Double) -> E.SqlExpr (E.Value (Maybe Double))


data AvailabilityListWhere
  = GetAll
  | PrepInputWhere     !(E.SqlExpr (Entity PrepInput)     -> E.SqlExpr (Entity PrepInputValue)   -> E.SqlQuery ())
  | WarmUpInputWhere   !(E.SqlExpr (Entity WarmUpInput)   -> E.SqlExpr (Entity WarmUpInputValue) -> E.SqlQuery ())
  | RepInputWhere      !(E.SqlExpr (Entity RepInput)      -> E.SqlExpr (Entity RepInputValue)    -> E.SqlQuery ())
  | PrepMeasureWhere   !(E.SqlExpr (Entity PrepMeasure)   -> E.SqlExpr (Entity PrepResultStep)   -> E.SqlQuery ())
  | WarmUpMeasureWhere !(E.SqlExpr (Entity WarmUpMeasure) -> E.SqlExpr (Entity WarmUpResultStep) -> E.SqlQuery ())
  | RepMeasureWhere    !(E.SqlExpr (Entity RepMeasure)    -> E.SqlExpr (Entity RepResultStep)    -> E.SqlQuery ())


instance Show AvailabilityListWhere where
  show GetAll{}             = "GetAll"
  show PrepInputWhere{}     = "PrepInputWhere"
  show WarmUpInputWhere{}   = "WarmUpInputWhere"
  show RepInputWhere{}      = "RepInputWhere"
  show PrepMeasureWhere{}   = "PrepMeasureWhere"
  show WarmUpMeasureWhere{} = "WarmUpMeasureWhere"
  show RepMeasureWhere{}    = "RepMeasureWhere"


data AvailabilityList m b
  = AvailableList !(Int, [b]) (AvailabilityListWhere -> ConduitT () b (DB m) ())
  | AvailableListOnDemand (Int, AvailabilityListWhere -> ConduitT () b (DB m) ())


instance (Show b) => Show (AvailabilityList m b) where
  show (AvailableList b _)       = show b
  show (AvailableListOnDemand _) = "AvailableList on demand"

instance (NFData b) => NFData (AvailabilityList m b) where
  rnf (AvailableList b _)            = rnf b
  rnf (AvailableListOnDemand (nr,_)) = rnf nr