packages feed

mockcat-1.2.1.0: test/Test/MockCat/SharedSpecDefs.hs

{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE AllowAmbiguousTypes #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE UndecidableInstances #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE GADTs #-}

module Test.MockCat.SharedSpecDefs
  ( FileOperation(..),
    program,
    Finder(..),
    findValue,
    FinderNoImplicit(..),
    findValueNI,
    ApiOperation(..),
    MonadStateSub(..),
    MonadStateSub2(..),
    MonadVar2_1,
    MonadVar2_1Sub(..),
    MonadVar2_2,
    MonadVar2_2Sub(..),
    MonadVar3_1,
    MonadVar3_1Sub(..),
    MonadVar3_2,
    MonadVar3_2Sub(..),
    MonadVar3_3,
    MonadVar3_3Sub(..),
    MultiApplyTest(..),
    getValues,
    ExplicitlyReturnMonadicValuesTest(..),
    ExplicitlyReturnMonadicValuesPartialTest(..),
    AssocTypeTest(..),
    DefaultMethodTest(..),
    ParamThreeMonad(..),
    MonadAsync(..),
    TestClass(..),
    Teletype(..),
    UserInput(..),
    UserInputGetter(..),
    Post(..),
    UserDefinedClass(..)
  )
where

import Prelude hiding (readFile, writeFile)
import Data.Text (Text)
import Control.Monad.IO.Class (MonadIO)
import Control.Monad.State (MonadState)
import Control.Monad.IO.Unlift (MonadUnliftIO)
import Data.Kind (Type)


class Monad m => FileOperation m where
  readFile :: FilePath -> m Text
  writeFile :: FilePath -> Text -> m ()

program ::
  FileOperation m =>
  FilePath ->
  FilePath ->
  m ()
program inputPath outputPath = do
  content <- readFile inputPath
  writeFile outputPath content

class Monad m => Finder a b m | a -> b, b -> a where
  findIds :: m [a]
  findById :: a -> m b

findValue :: Finder a b m => m [b]
findValue = do
  ids <- findIds
  mapM findById ids

class Monad m => ApiOperation m where
  post :: Text -> m ()

class (Eq s, Show s, MonadState s m) => MonadStateSub s m where
  fnState :: Maybe s -> m s

class (MonadState String m) => MonadStateSub2 s m where
  fnState2 :: String -> m ()

class Monad m => MonadVar2_1 m a where
class MonadVar2_1 m a => MonadVar2_1Sub m a where
  fn2_1Sub :: String -> m ()

class Monad m => MonadVar2_2 a m where
class MonadVar2_2 a m => MonadVar2_2Sub a m where
  fn2_2Sub :: String -> m ()

class MonadIO m => MonadVar3_1 m a b where
class MonadVar3_1 m a b => MonadVar3_1Sub m a b where
  fn3_1Sub :: String -> m ()

class MonadIO m => MonadVar3_2 a m b where
class MonadVar3_2 a m b => MonadVar3_2Sub a m b where
  fn3_2Sub :: String -> m ()

class MonadIO m => MonadVar3_3 a b m where
class MonadVar3_3 a b m => MonadVar3_3Sub a b m where
  fn3_3Sub :: String -> m ()

class Monad m => MultiApplyTest m where
  getValueBy :: String -> m String

getValues :: MultiApplyTest m => [String] -> m [String]
getValues = mapM getValueBy

class Monad m => ExplicitlyReturnMonadicValuesTest m where
  echoExplicit :: String -> m ()
  getByExplicit :: String -> m Int

class Monad m => ExplicitlyReturnMonadicValuesPartialTest m where
  echoExplicitPartial :: String -> m ()
  getByExplicitPartial :: String -> m Int

class Monad m => AssocTypeTest m where
  type ResultType m :: Type
  produce :: m (ResultType m)

class Monad m => DefaultMethodTest m where
  defaultAction :: m Int
  defaultAction = pure 0

class Monad m => ParamThreeMonad a b m | m -> a, m -> b where
  fnParam3_1 :: a -> b -> m String
  fnParam3_2 :: m a
  fnParam3_3 :: m b

class MonadUnliftIO m => MonadAsync m where
  mapConcurrently :: Traversable t => (a -> m b) -> t a -> m (t b)

class Monad m => TestClass m where
  echo :: String -> m ()
  getBy :: String -> m Int

class Monad m => Teletype m where
  readTTY :: m String
  writeTTY :: String -> m ()

newtype UserInput = UserInput String deriving (Show, Eq)

class Monad m => UserInputGetter m where
  getInput :: m String
  toUserInput :: String -> m (Maybe UserInput)

-- Duplicate Finder variant without implicit monadic return (for TH tests)
class Monad m => FinderNoImplicit a b m | a -> b, b -> a where
  findIdsNI :: m [a]
  findByIdNI :: a -> m b

findValueNI :: FinderNoImplicit a b m => m [b]
findValueNI = do
  ids <- findIdsNI
  mapM findByIdNI ids

data Post = Post { postId :: Int, title :: String }
  deriving (Eq, Show)

class Monad m => UserDefinedClass m where
  processPost :: Post -> m Bool