packages feed

hydra-0.12.0: src/main/haskell/Hydra/Lib/Flows.hs

-- | Haskell implementations of hydra.lib.flows primitives. These are simply wrappers around hydra.flows functions.

module Hydra.Lib.Flows where

import Hydra.Compute
import qualified Hydra.Monads as Monads

import qualified Control.Monad as CM
import qualified Data.Map as M
import qualified Data.Set as S


-- Haskell-specific helpers

instance Functor (Flow s) where
  fmap = CM.liftM
instance Applicative (Flow s) where
  pure = Monads.pure
  (<*>) = CM.ap
instance Monad (Flow s) where
  (>>=) = Monads.bind
instance MonadFail (Flow s) where
  fail = Monads.fail

-- Primitive functions

apply :: Flow s (x -> y) -> Flow s x -> Flow s y
apply = (<*>)

bind :: Flow s x -> (x -> Flow s y) -> Flow s y
bind = Monads.bind

fail :: String -> Flow s x
fail = Monads.fail

map :: (x -> y) -> Flow s x -> Flow s y
map = Monads.map

mapElems :: Ord k => (v1 -> Flow s v2) -> M.Map k v1 -> Flow s (M.Map k v2)
mapElems f m = M.fromList <$> (CM.mapM (\(k, v) -> (,) <$> Monads.pure k <*> f v) $ M.toList m)

mapKeys :: Ord k2 => (k1 -> Flow s k2) -> M.Map k1 v -> Flow s (M.Map k2 v)
mapKeys f m = M.fromList <$> (CM.mapM (\(k, v) -> (,) <$> f k <*> Monads.pure v) $ M.toList m)

mapList :: (x -> Flow s y) -> [x] -> Flow s [y]
mapList = CM.mapM

mapOptional :: (x -> Flow s y) -> Maybe x -> Flow s (Maybe y)
mapOptional = traverse

mapSet :: Ord y => (x -> Flow s y) -> S.Set x -> Flow s (S.Set y)
mapSet f xs = S.fromList <$> (CM.mapM f $ S.toList xs)

pure :: x -> Flow s x
pure = Monads.pure

sequence :: [Flow s x] -> Flow s [x]
sequence = CM.sequence