-- |
-- Module      :  TLynx.TLynx
-- Description :  TLynx module
-- Copyright   :  (c) Dominik Schrempf 2020
-- License     :  GPL-3.0-or-later
--
-- Maintainer  :  dominik.schrempf@gmail.com
-- Stability   :  unstable
-- Portability :  portable
--
-- Creation date: Thu Apr 23 16:36:43 2020.
module TLynx.TLynx
  ( tlynx,
    rTLynx,
  )
where

import ELynx.Tools
import TLynx.Compare.Compare
import TLynx.Connect.Connect
import TLynx.Distance.Distance
import TLynx.Examine.Examine
import TLynx.Options
import TLynx.Shuffle.Shuffle
import TLynx.Simulate.Simulate

-- TODO: Use a class here (e.g., elynx-wrappable) which defines the extractor function.

-- | Run TLynx with given arguments.
tlynx :: Arguments CommandArguments -> IO ()
tlynx :: Arguments CommandArguments -> IO ()
tlynx Arguments CommandArguments
c = case Arguments CommandArguments -> CommandArguments
forall a. Arguments a -> a
local Arguments CommandArguments
c of
  Compare CompareArguments
_ ->
    Arguments CommandArguments
-> (Arguments CommandArguments -> Arguments CompareArguments)
-> ELynx CompareArguments ()
-> IO ()
forall a b.
(Eq a, Show a, Reproducible a, ToJSON a) =>
Arguments a -> (Arguments a -> Arguments b) -> ELynx b () -> IO ()
eLynxWrapper Arguments CommandArguments
c (\(Arguments GlobalArguments
g (Compare CompareArguments
l)) -> GlobalArguments -> CompareArguments -> Arguments CompareArguments
forall a. GlobalArguments -> a -> Arguments a
Arguments GlobalArguments
g CompareArguments
l) ELynx CompareArguments ()
compareCmd
  Connect ConnectArguments
_ ->
    Arguments CommandArguments
-> (Arguments CommandArguments -> Arguments ConnectArguments)
-> ELynx ConnectArguments ()
-> IO ()
forall a b.
(Eq a, Show a, Reproducible a, ToJSON a) =>
Arguments a -> (Arguments a -> Arguments b) -> ELynx b () -> IO ()
eLynxWrapper Arguments CommandArguments
c (\(Arguments GlobalArguments
g (Connect ConnectArguments
l)) -> GlobalArguments -> ConnectArguments -> Arguments ConnectArguments
forall a. GlobalArguments -> a -> Arguments a
Arguments GlobalArguments
g ConnectArguments
l) ELynx ConnectArguments ()
connectCmd
  Distance DistanceArguments
_ ->
    Arguments CommandArguments
-> (Arguments CommandArguments -> Arguments DistanceArguments)
-> ELynx DistanceArguments ()
-> IO ()
forall a b.
(Eq a, Show a, Reproducible a, ToJSON a) =>
Arguments a -> (Arguments a -> Arguments b) -> ELynx b () -> IO ()
eLynxWrapper Arguments CommandArguments
c (\(Arguments GlobalArguments
g (Distance DistanceArguments
l)) -> GlobalArguments -> DistanceArguments -> Arguments DistanceArguments
forall a. GlobalArguments -> a -> Arguments a
Arguments GlobalArguments
g DistanceArguments
l) ELynx DistanceArguments ()
distance
  Examine ExamineArguments
_ ->
    Arguments CommandArguments
-> (Arguments CommandArguments -> Arguments ExamineArguments)
-> ELynx ExamineArguments ()
-> IO ()
forall a b.
(Eq a, Show a, Reproducible a, ToJSON a) =>
Arguments a -> (Arguments a -> Arguments b) -> ELynx b () -> IO ()
eLynxWrapper Arguments CommandArguments
c (\(Arguments GlobalArguments
g (Examine ExamineArguments
l)) -> GlobalArguments -> ExamineArguments -> Arguments ExamineArguments
forall a. GlobalArguments -> a -> Arguments a
Arguments GlobalArguments
g ExamineArguments
l) ELynx ExamineArguments ()
examine
  Shuffle ShuffleArguments
_ ->
    Arguments CommandArguments
-> (Arguments CommandArguments -> Arguments ShuffleArguments)
-> ELynx ShuffleArguments ()
-> IO ()
forall a b.
(Eq a, Show a, Reproducible a, ToJSON a) =>
Arguments a -> (Arguments a -> Arguments b) -> ELynx b () -> IO ()
eLynxWrapper Arguments CommandArguments
c (\(Arguments GlobalArguments
g (Shuffle ShuffleArguments
l)) -> GlobalArguments -> ShuffleArguments -> Arguments ShuffleArguments
forall a. GlobalArguments -> a -> Arguments a
Arguments GlobalArguments
g ShuffleArguments
l) ELynx ShuffleArguments ()
shuffleCmd
  Simulate SimulateArguments
_ ->
    Arguments CommandArguments
-> (Arguments CommandArguments -> Arguments SimulateArguments)
-> ELynx SimulateArguments ()
-> IO ()
forall a b.
(Eq a, Show a, Reproducible a, ToJSON a) =>
Arguments a -> (Arguments a -> Arguments b) -> ELynx b () -> IO ()
eLynxWrapper Arguments CommandArguments
c (\(Arguments GlobalArguments
g (Simulate SimulateArguments
l)) -> GlobalArguments -> SimulateArguments -> Arguments SimulateArguments
forall a. GlobalArguments -> a -> Arguments a
Arguments GlobalArguments
g SimulateArguments
l) ELynx SimulateArguments ()
simulate

-- | Run TLynx, parse arguments from command line.
rTLynx :: IO ()
rTLynx :: IO ()
rTLynx = IO (Arguments CommandArguments)
forall a. Reproducible a => IO (Arguments a)
parseArguments IO (Arguments CommandArguments)
-> (Arguments CommandArguments -> IO ()) -> IO ()
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Arguments CommandArguments -> IO ()
tlynx