module Chiasma.Data.SplitParams where

import Chiasma.Class.CmdArgs (CmdArgs (cmdArgs), flag1, optionArgs)
import Chiasma.Data.Axis (Axis)
import Chiasma.Data.Target (Target (Current), formatTarget)

data SplitSize =
  Units Int
  |
  Percentage Int
  deriving stock (SplitSize -> SplitSize -> Bool
(SplitSize -> SplitSize -> Bool)
-> (SplitSize -> SplitSize -> Bool) -> Eq SplitSize
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SplitSize -> SplitSize -> Bool
$c/= :: SplitSize -> SplitSize -> Bool
== :: SplitSize -> SplitSize -> Bool
$c== :: SplitSize -> SplitSize -> Bool
Eq, Int -> SplitSize -> ShowS
[SplitSize] -> ShowS
SplitSize -> String
(Int -> SplitSize -> ShowS)
-> (SplitSize -> String)
-> ([SplitSize] -> ShowS)
-> Show SplitSize
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SplitSize] -> ShowS
$cshowList :: [SplitSize] -> ShowS
show :: SplitSize -> String
$cshow :: SplitSize -> String
showsPrec :: Int -> SplitSize -> ShowS
$cshowsPrec :: Int -> SplitSize -> ShowS
Show)

instance CmdArgs SplitSize where
  cmdArgs :: SplitSize -> [Text]
cmdArgs = \case
    Units Int
n -> [Item [Text]
"-l", Int -> Text
forall b a. (Show a, IsString b) => a -> b
show Int
n]
    Percentage Int
n -> [Item [Text]
"-p", Int -> Text
forall b a. (Show a, IsString b) => a -> b
show Int
n]

data SplitWindowParams =
  SplitWindowParams {
    SplitWindowParams -> Maybe Axis
axis :: Maybe Axis,
    SplitWindowParams -> Maybe SplitSize
size :: Maybe SplitSize,
    SplitWindowParams -> Bool
before :: Bool,
    SplitWindowParams -> Bool
fullSize :: Bool,
    SplitWindowParams -> Bool
readStdin :: Bool
  }
  deriving stock (SplitWindowParams -> SplitWindowParams -> Bool
(SplitWindowParams -> SplitWindowParams -> Bool)
-> (SplitWindowParams -> SplitWindowParams -> Bool)
-> Eq SplitWindowParams
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SplitWindowParams -> SplitWindowParams -> Bool
$c/= :: SplitWindowParams -> SplitWindowParams -> Bool
== :: SplitWindowParams -> SplitWindowParams -> Bool
$c== :: SplitWindowParams -> SplitWindowParams -> Bool
Eq, Int -> SplitWindowParams -> ShowS
[SplitWindowParams] -> ShowS
SplitWindowParams -> String
(Int -> SplitWindowParams -> ShowS)
-> (SplitWindowParams -> String)
-> ([SplitWindowParams] -> ShowS)
-> Show SplitWindowParams
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [SplitWindowParams] -> ShowS
$cshowList :: [SplitWindowParams] -> ShowS
show :: SplitWindowParams -> String
$cshow :: SplitWindowParams -> String
showsPrec :: Int -> SplitWindowParams -> ShowS
$cshowsPrec :: Int -> SplitWindowParams -> ShowS
Show)

instance Default SplitWindowParams where
  def :: SplitWindowParams
def =
    SplitWindowParams :: Maybe Axis
-> Maybe SplitSize -> Bool -> Bool -> Bool -> SplitWindowParams
SplitWindowParams {
      $sel:axis:SplitWindowParams :: Maybe Axis
axis = Maybe Axis
forall a. Maybe a
Nothing,
      $sel:size:SplitWindowParams :: Maybe SplitSize
size = Maybe SplitSize
forall a. Maybe a
Nothing,
      $sel:before:SplitWindowParams :: Bool
before = Bool
False,
      $sel:fullSize:SplitWindowParams :: Bool
fullSize = Bool
False,
      $sel:readStdin:SplitWindowParams :: Bool
readStdin = Bool
False
    }

instance CmdArgs SplitWindowParams where
  cmdArgs :: SplitWindowParams -> [Text]
cmdArgs SplitWindowParams {Bool
Maybe Axis
Maybe SplitSize
readStdin :: Bool
fullSize :: Bool
before :: Bool
size :: Maybe SplitSize
axis :: Maybe Axis
$sel:readStdin:SplitWindowParams :: SplitWindowParams -> Bool
$sel:fullSize:SplitWindowParams :: SplitWindowParams -> Bool
$sel:before:SplitWindowParams :: SplitWindowParams -> Bool
$sel:size:SplitWindowParams :: SplitWindowParams -> Maybe SplitSize
$sel:axis:SplitWindowParams :: SplitWindowParams -> Maybe Axis
..} =
    Maybe Axis -> [Text]
forall a. CmdArgs a => Maybe a -> [Text]
optionArgs Maybe Axis
axis
    [Text] -> [Text] -> [Text]
forall a. Semigroup a => a -> a -> a
<>
    Maybe SplitSize -> [Text]
forall a. CmdArgs a => Maybe a -> [Text]
optionArgs Maybe SplitSize
size
    [Text] -> [Text] -> [Text]
forall a. Semigroup a => a -> a -> a
<>
    Text -> Bool -> [Text]
flag1 Text
"-b" Bool
before
    [Text] -> [Text] -> [Text]
forall a. Semigroup a => a -> a -> a
<>
    Text -> Bool -> [Text]
flag1 Text
"-f" Bool
fullSize
    [Text] -> [Text] -> [Text]
forall a. Semigroup a => a -> a -> a
<>
    Text -> Bool -> [Text]
flag1 Text
"-K" Bool
readStdin

data JoinPaneParams =
  JoinPaneParams {
    JoinPaneParams -> Maybe Axis
axis :: Maybe Axis,
    JoinPaneParams -> Maybe SplitSize
size :: Maybe SplitSize,
    JoinPaneParams -> Bool
before :: Bool,
    JoinPaneParams -> Bool
detach :: Bool,
    JoinPaneParams -> Maybe Target
source :: Maybe Target,
    JoinPaneParams -> Target
target :: Target
  }
  deriving stock (JoinPaneParams -> JoinPaneParams -> Bool
(JoinPaneParams -> JoinPaneParams -> Bool)
-> (JoinPaneParams -> JoinPaneParams -> Bool) -> Eq JoinPaneParams
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: JoinPaneParams -> JoinPaneParams -> Bool
$c/= :: JoinPaneParams -> JoinPaneParams -> Bool
== :: JoinPaneParams -> JoinPaneParams -> Bool
$c== :: JoinPaneParams -> JoinPaneParams -> Bool
Eq, Int -> JoinPaneParams -> ShowS
[JoinPaneParams] -> ShowS
JoinPaneParams -> String
(Int -> JoinPaneParams -> ShowS)
-> (JoinPaneParams -> String)
-> ([JoinPaneParams] -> ShowS)
-> Show JoinPaneParams
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [JoinPaneParams] -> ShowS
$cshowList :: [JoinPaneParams] -> ShowS
show :: JoinPaneParams -> String
$cshow :: JoinPaneParams -> String
showsPrec :: Int -> JoinPaneParams -> ShowS
$cshowsPrec :: Int -> JoinPaneParams -> ShowS
Show)

instance Default JoinPaneParams where
  def :: JoinPaneParams
def =
    JoinPaneParams :: Maybe Axis
-> Maybe SplitSize
-> Bool
-> Bool
-> Maybe Target
-> Target
-> JoinPaneParams
JoinPaneParams {
      $sel:axis:JoinPaneParams :: Maybe Axis
axis = Maybe Axis
forall a. Maybe a
Nothing,
      $sel:size:JoinPaneParams :: Maybe SplitSize
size = Maybe SplitSize
forall a. Maybe a
Nothing,
      $sel:before:JoinPaneParams :: Bool
before = Bool
False,
      $sel:detach:JoinPaneParams :: Bool
detach = Bool
False,
      $sel:source:JoinPaneParams :: Maybe Target
source = Maybe Target
forall a. Maybe a
Nothing,
      $sel:target:JoinPaneParams :: Target
target = Target
Current
    }

instance CmdArgs JoinPaneParams where
  cmdArgs :: JoinPaneParams -> [Text]
cmdArgs JoinPaneParams {Bool
Maybe Axis
Maybe Target
Maybe SplitSize
Target
target :: Target
source :: Maybe Target
detach :: Bool
before :: Bool
size :: Maybe SplitSize
axis :: Maybe Axis
$sel:target:JoinPaneParams :: JoinPaneParams -> Target
$sel:source:JoinPaneParams :: JoinPaneParams -> Maybe Target
$sel:detach:JoinPaneParams :: JoinPaneParams -> Bool
$sel:before:JoinPaneParams :: JoinPaneParams -> Bool
$sel:size:JoinPaneParams :: JoinPaneParams -> Maybe SplitSize
$sel:axis:JoinPaneParams :: JoinPaneParams -> Maybe Axis
..} =
    Maybe Axis -> [Text]
forall a. CmdArgs a => Maybe a -> [Text]
optionArgs Maybe Axis
axis
    [Text] -> [Text] -> [Text]
forall a. Semigroup a => a -> a -> a
<>
    Maybe SplitSize -> [Text]
forall a. CmdArgs a => Maybe a -> [Text]
optionArgs Maybe SplitSize
size
    [Text] -> [Text] -> [Text]
forall a. Semigroup a => a -> a -> a
<>
    Text -> Bool -> [Text]
flag1 Text
"-b" Bool
before
    [Text] -> [Text] -> [Text]
forall a. Semigroup a => a -> a -> a
<>
    Text -> Bool -> [Text]
flag1 Text
"-d" Bool
detach
    [Text] -> [Text] -> [Text]
forall a. Semigroup a => a -> a -> a
<>
    (Target -> [Text]) -> Maybe Target -> [Text]
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
foldMap ([Text] -> Target -> [Text]
formatTarget [Item [Text]
"-s"]) Maybe Target
source
    [Text] -> [Text] -> [Text]
forall a. Semigroup a => a -> a -> a
<>
    Target -> [Text]
forall a. CmdArgs a => a -> [Text]
cmdArgs Target
target