module Chiasma.Data.ResizePaneParams where

import Chiasma.Class.CmdArgs (CmdArgs (cmdArgs), arg, flag1, optionArgs)
import Chiasma.Data.Axis (Axis (Horizontal, Vertical))
import Chiasma.Data.Direction (Direction)
import Chiasma.Data.Target (Target (Current))

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

instance CmdArgs ResizeAbsolute where
  cmdArgs :: ResizeAbsolute -> [Text]
cmdArgs (ResizeAbsolute Axis
axis Int
amount) =
    [Axis -> Text
axisArg Axis
axis, Int -> Text
forall b a. (Show a, IsString b) => a -> b
show Int
amount]
    where
      axisArg :: Axis -> Text
axisArg = \case
        Axis
Horizontal -> Text
"-x"
        Axis
Vertical -> Text
"-y"

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

instance CmdArgs Adjustment where
  cmdArgs :: Adjustment -> [Text]
cmdArgs (Adjustment Maybe Direction
dir Maybe Int
amount) =
    Maybe Direction -> [Text]
forall a. CmdArgs a => Maybe a -> [Text]
optionArgs Maybe Direction
dir [Text] -> [Text] -> [Text]
forall a. Semigroup a => a -> a -> a
<> Maybe Text -> [Text]
arg (Int -> Text
forall b a. (Show a, IsString b) => a -> b
show (Int -> Text) -> Maybe Int -> Maybe Text
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Maybe Int
amount)

data ResizePaneParams =
  ResizePaneParams {
    ResizePaneParams -> Maybe ResizeAbsolute
absolute :: Maybe ResizeAbsolute,
    ResizePaneParams -> Maybe Adjustment
adjustment :: Maybe Adjustment,
    ResizePaneParams -> Bool
zoom :: Bool,
    ResizePaneParams -> Bool
mouse :: Bool,
    ResizePaneParams -> Target
target :: Target
  }
  deriving stock (ResizePaneParams -> ResizePaneParams -> Bool
(ResizePaneParams -> ResizePaneParams -> Bool)
-> (ResizePaneParams -> ResizePaneParams -> Bool)
-> Eq ResizePaneParams
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ResizePaneParams -> ResizePaneParams -> Bool
$c/= :: ResizePaneParams -> ResizePaneParams -> Bool
== :: ResizePaneParams -> ResizePaneParams -> Bool
$c== :: ResizePaneParams -> ResizePaneParams -> Bool
Eq, Int -> ResizePaneParams -> ShowS
[ResizePaneParams] -> ShowS
ResizePaneParams -> String
(Int -> ResizePaneParams -> ShowS)
-> (ResizePaneParams -> String)
-> ([ResizePaneParams] -> ShowS)
-> Show ResizePaneParams
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [ResizePaneParams] -> ShowS
$cshowList :: [ResizePaneParams] -> ShowS
show :: ResizePaneParams -> String
$cshow :: ResizePaneParams -> String
showsPrec :: Int -> ResizePaneParams -> ShowS
$cshowsPrec :: Int -> ResizePaneParams -> ShowS
Show)

instance Default ResizePaneParams where
  def :: ResizePaneParams
def =
    ResizePaneParams :: Maybe ResizeAbsolute
-> Maybe Adjustment -> Bool -> Bool -> Target -> ResizePaneParams
ResizePaneParams {
      $sel:absolute:ResizePaneParams :: Maybe ResizeAbsolute
absolute = Maybe ResizeAbsolute
forall a. Maybe a
Nothing,
      $sel:adjustment:ResizePaneParams :: Maybe Adjustment
adjustment = Maybe Adjustment
forall a. Maybe a
Nothing,
      $sel:zoom:ResizePaneParams :: Bool
zoom = Bool
False,
      $sel:mouse:ResizePaneParams :: Bool
mouse = Bool
False,
      $sel:target:ResizePaneParams :: Target
target = Target
Current
    }

instance CmdArgs ResizePaneParams where
  cmdArgs :: ResizePaneParams -> [Text]
cmdArgs ResizePaneParams {Bool
Maybe Adjustment
Maybe ResizeAbsolute
Target
target :: Target
mouse :: Bool
zoom :: Bool
adjustment :: Maybe Adjustment
absolute :: Maybe ResizeAbsolute
$sel:target:ResizePaneParams :: ResizePaneParams -> Target
$sel:mouse:ResizePaneParams :: ResizePaneParams -> Bool
$sel:zoom:ResizePaneParams :: ResizePaneParams -> Bool
$sel:adjustment:ResizePaneParams :: ResizePaneParams -> Maybe Adjustment
$sel:absolute:ResizePaneParams :: ResizePaneParams -> Maybe ResizeAbsolute
..} =
    Maybe ResizeAbsolute -> [Text]
forall a. CmdArgs a => Maybe a -> [Text]
optionArgs Maybe ResizeAbsolute
absolute
    [Text] -> [Text] -> [Text]
forall a. Semigroup a => a -> a -> a
<>
    Text -> Bool -> [Text]
flag1 Text
"-Z" Bool
zoom
    [Text] -> [Text] -> [Text]
forall a. Semigroup a => a -> a -> a
<>
    Text -> Bool -> [Text]
flag1 Text
"-M" Bool
mouse
    [Text] -> [Text] -> [Text]
forall a. Semigroup a => a -> a -> a
<>
    Maybe Adjustment -> [Text]
forall a. CmdArgs a => Maybe a -> [Text]
optionArgs Maybe Adjustment
adjustment
    [Text] -> [Text] -> [Text]
forall a. Semigroup a => a -> a -> a
<>
    Target -> [Text]
forall a. CmdArgs a => a -> [Text]
cmdArgs Target
target