hs-cctools-workqueue / Control / Distributed / CCTools / WorkQueue / Internal / CastInstances.hs

-- -*- indent-tabs-mode: nil -*- --

{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}

module Control.Distributed.CCTools.WorkQueue.Internal.CastInstances where

import Bindings.CCTools.WorkQueue

import Control.Distributed.CCTools.WorkQueue.Internal.Cast
import Control.Distributed.CCTools.WorkQueue.Internal.Types

import Foreign.C.Types

import Control.Lens ((^.))

-- * Haskell-provided

-- ** 'Int' <-> 'CInt'
instance Castable Int CInt       where cast = fromIntegral
instance Castable CInt Int       where cast = fromIntegral

-- ** 'Double' <-> 'CDouble'
instance Castable Double CDouble where cast = fromRational . toRational
instance Castable CDouble Double where cast = fromRational . toRational



-- * For WorkQueue

-- ** Utilities

-- *** 'Castable' a b => 'Castable' ('NPlus' a) b
instance Castable a b => Castable (NPlus a) b where
    cast (NP v) = cast v

instance ( Castable a b
         , Num a, Num b
         , Ord a
         , Show a)
    => Castable a (NPlus b)
    where
      cast v | v > 0     = NP    $ cast v
             | otherwise = error $ "Got a non-positive value when constructing an NPlus: " ++ show v

-- *** DataSize

instance Castable (DataSize a) Integer where
    cast = _unDS

-- *** Time

instance Castable (EpochTime a) Integer where cast = _unET
instance Castable (DiffTime  a) Integer where cast = _unDT


-- *** File Locality

instance Castable (Location a) FilePath where cast = _unL


-- ** 'MasterMode'

instance Castable MasterMode CInt where
    cast Standalone = c'WORK_QUEUE_MASTER_MODE_STANDALONE
    cast Catalog    = c'WORK_QUEUE_MASTER_MODE_CATALOG

instance Castable CInt MasterMode where
    cast v | v == c'WORK_QUEUE_MASTER_MODE_STANDALONE = Standalone
              | v == c'WORK_QUEUE_MASTER_MODE_CATALOG    = Catalog
              | otherwise                                = error $ "Cannot cast to MasterMode: " ++ show v


-- ** 'Hunger'

instance Castable CInt Hunger where
    cast v | v <= 0    = Full
              | otherwise = Hungry $ fromIntegral v


-- ** 'FastAbort'

instance Castable FastAbort CDouble where
    cast FastAbortOff = 0
    cast (FastAbort v) = cast v

-- ** 'Timeout'

instance Castable Timeout CInt where
    cast Forever = -1
    cast (Seconds v) = fromIntegral v

-- ** 'Cached'

instance Castable Cached CInt where
    cast c = if c
                then c'WORK_QUEUE_CACHE
                else c'WORK_QUEUE_NOCACHE


-- ** 'WorkerScheduleAlg'

instance Castable WorkerScheduleAlg CInt where
    cast FCFS  = c'WORK_QUEUE_SCHEDULE_FCFS
    cast FILES = c'WORK_QUEUE_SCHEDULE_FILES
    cast TIME  = c'WORK_QUEUE_SCHEDULE_TIME
    cast RAND  = c'WORK_QUEUE_SCHEDULE_RAND  

instance Castable CInt WorkerScheduleAlg where
    cast v | v == c'WORK_QUEUE_SCHEDULE_FCFS  = FCFS
              | v == c'WORK_QUEUE_SCHEDULE_FILES = FILES
              | v == c'WORK_QUEUE_SCHEDULE_TIME  = TIME
              | v == c'WORK_QUEUE_SCHEDULE_RAND  = RAND
              | otherwise                        = error $ "Cannot cast CInt to WorkerScheduleAlg: " ++ show v

-- ** 'TaskOrdering'

instance Castable TaskOrdering CInt where
    cast LIFO = c'WORK_QUEUE_TASK_ORDER_LIFO
    cast FIFO = c'WORK_QUEUE_TASK_ORDER_FIFO

-- ** 'FileType'

instance Castable FileType CInt where
    cast InputFile  = c'WORK_QUEUE_INPUT
    cast OutputFile = c'WORK_QUEUE_OUTPUT

-- ** TaskID

instance Castable CInt TaskID where
    cast = TID . fromIntegral

instance Integral b => Castable TaskID b where
    cast (TID v) = fromIntegral v


-- ** Port

instance Castable (Maybe Port) CInt where
    cast Nothing = c'WORK_QUEUE_RANDOM_PORT
    cast (Just p) = cast $ p^.unP

-- ** Command

instance Castable Command String where
    cast = _unC
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.