module Ribosome.Data.FloatOptions where

import qualified Data.Map as Map

import Ribosome.Msgpack.Encode (MsgpackEncode(toMsgpack))

data FloatRelative =
  Editor
  |
  Win
  |
  Cursor
  deriving (FloatRelative -> FloatRelative -> Bool
(FloatRelative -> FloatRelative -> Bool)
-> (FloatRelative -> FloatRelative -> Bool) -> Eq FloatRelative
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: FloatRelative -> FloatRelative -> Bool
$c/= :: FloatRelative -> FloatRelative -> Bool
== :: FloatRelative -> FloatRelative -> Bool
$c== :: FloatRelative -> FloatRelative -> Bool
Eq, Int -> FloatRelative -> ShowS
[FloatRelative] -> ShowS
FloatRelative -> String
(Int -> FloatRelative -> ShowS)
-> (FloatRelative -> String)
-> ([FloatRelative] -> ShowS)
-> Show FloatRelative
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [FloatRelative] -> ShowS
$cshowList :: [FloatRelative] -> ShowS
show :: FloatRelative -> String
$cshow :: FloatRelative -> String
showsPrec :: Int -> FloatRelative -> ShowS
$cshowsPrec :: Int -> FloatRelative -> ShowS
Show)

instance MsgpackEncode FloatRelative where
  toMsgpack :: FloatRelative -> Object
toMsgpack FloatRelative
Editor = Text -> Object
forall a. MsgpackEncode a => a -> Object
toMsgpack (Text
"editor" :: Text)
  toMsgpack FloatRelative
Win = Text -> Object
forall a. MsgpackEncode a => a -> Object
toMsgpack (Text
"win" :: Text)
  toMsgpack FloatRelative
Cursor = Text -> Object
forall a. MsgpackEncode a => a -> Object
toMsgpack (Text
"cursor" :: Text)

instance Default FloatRelative where
  def :: FloatRelative
def = FloatRelative
Cursor

data FloatAnchor =
  NW
  |
  NE
  |
  SW
  |
  SE
  deriving (FloatAnchor -> FloatAnchor -> Bool
(FloatAnchor -> FloatAnchor -> Bool)
-> (FloatAnchor -> FloatAnchor -> Bool) -> Eq FloatAnchor
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: FloatAnchor -> FloatAnchor -> Bool
$c/= :: FloatAnchor -> FloatAnchor -> Bool
== :: FloatAnchor -> FloatAnchor -> Bool
$c== :: FloatAnchor -> FloatAnchor -> Bool
Eq, Int -> FloatAnchor -> ShowS
[FloatAnchor] -> ShowS
FloatAnchor -> String
(Int -> FloatAnchor -> ShowS)
-> (FloatAnchor -> String)
-> ([FloatAnchor] -> ShowS)
-> Show FloatAnchor
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [FloatAnchor] -> ShowS
$cshowList :: [FloatAnchor] -> ShowS
show :: FloatAnchor -> String
$cshow :: FloatAnchor -> String
showsPrec :: Int -> FloatAnchor -> ShowS
$cshowsPrec :: Int -> FloatAnchor -> ShowS
Show)

instance MsgpackEncode FloatAnchor where
  toMsgpack :: FloatAnchor -> Object
toMsgpack FloatAnchor
NW = Text -> Object
forall a. MsgpackEncode a => a -> Object
toMsgpack (Text
"NW" :: Text)
  toMsgpack FloatAnchor
NE = Text -> Object
forall a. MsgpackEncode a => a -> Object
toMsgpack (Text
"NE" :: Text)
  toMsgpack FloatAnchor
SW = Text -> Object
forall a. MsgpackEncode a => a -> Object
toMsgpack (Text
"SW" :: Text)
  toMsgpack FloatAnchor
SE = Text -> Object
forall a. MsgpackEncode a => a -> Object
toMsgpack (Text
"SE" :: Text)

instance Default FloatAnchor where
  def :: FloatAnchor
def = FloatAnchor
NW

data FloatOptions =
  FloatOptions {
    FloatOptions -> FloatRelative
relative :: FloatRelative,
    FloatOptions -> Int
width :: Int,
    FloatOptions -> Int
height :: Int,
    FloatOptions -> Int
row :: Int,
    FloatOptions -> Int
col :: Int,
    FloatOptions -> Bool
focusable :: Bool,
    FloatOptions -> FloatAnchor
anchor :: FloatAnchor,
    FloatOptions -> Maybe (Int, Int)
bufpos :: Maybe (Int, Int)
  }
  deriving (FloatOptions -> FloatOptions -> Bool
(FloatOptions -> FloatOptions -> Bool)
-> (FloatOptions -> FloatOptions -> Bool) -> Eq FloatOptions
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: FloatOptions -> FloatOptions -> Bool
$c/= :: FloatOptions -> FloatOptions -> Bool
== :: FloatOptions -> FloatOptions -> Bool
$c== :: FloatOptions -> FloatOptions -> Bool
Eq, Int -> FloatOptions -> ShowS
[FloatOptions] -> ShowS
FloatOptions -> String
(Int -> FloatOptions -> ShowS)
-> (FloatOptions -> String)
-> ([FloatOptions] -> ShowS)
-> Show FloatOptions
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [FloatOptions] -> ShowS
$cshowList :: [FloatOptions] -> ShowS
show :: FloatOptions -> String
$cshow :: FloatOptions -> String
showsPrec :: Int -> FloatOptions -> ShowS
$cshowsPrec :: Int -> FloatOptions -> ShowS
Show, (forall x. FloatOptions -> Rep FloatOptions x)
-> (forall x. Rep FloatOptions x -> FloatOptions)
-> Generic FloatOptions
forall x. Rep FloatOptions x -> FloatOptions
forall x. FloatOptions -> Rep FloatOptions x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep FloatOptions x -> FloatOptions
$cfrom :: forall x. FloatOptions -> Rep FloatOptions x
Generic)

instance MsgpackEncode FloatOptions where
  toMsgpack :: FloatOptions -> Object
toMsgpack FloatOptions {Bool
Int
Maybe (Int, Int)
FloatAnchor
FloatRelative
bufpos :: Maybe (Int, Int)
anchor :: FloatAnchor
focusable :: Bool
col :: Int
row :: Int
height :: Int
width :: Int
relative :: FloatRelative
$sel:bufpos:FloatOptions :: FloatOptions -> Maybe (Int, Int)
$sel:anchor:FloatOptions :: FloatOptions -> FloatAnchor
$sel:focusable:FloatOptions :: FloatOptions -> Bool
$sel:col:FloatOptions :: FloatOptions -> Int
$sel:row:FloatOptions :: FloatOptions -> Int
$sel:height:FloatOptions :: FloatOptions -> Int
$sel:width:FloatOptions :: FloatOptions -> Int
$sel:relative:FloatOptions :: FloatOptions -> FloatRelative
..} =
    Map Text Object -> Object
forall a. MsgpackEncode a => a -> Object
toMsgpack (Map Text Object -> Object) -> Map Text Object -> Object
forall a b. (a -> b) -> a -> b
$ [(Text, Object)] -> Map Text Object
forall k a. Ord k => [(k, a)] -> Map k a
Map.fromList ([(Text, Object)]
simple [(Text, Object)] -> [(Text, Object)] -> [(Text, Object)]
forall a. [a] -> [a] -> [a]
++ [(Text, Object)]
-> ((Int, Int) -> [(Text, Object)])
-> Maybe (Int, Int)
-> [(Text, Object)]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] ((Text, Object) -> [(Text, Object)]
forall (f :: * -> *) a. Applicative f => a -> f a
pure ((Text, Object) -> [(Text, Object)])
-> ((Int, Int) -> (Text, Object)) -> (Int, Int) -> [(Text, Object)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Text
"bufpos",) (Object -> (Text, Object))
-> ((Int, Int) -> Object) -> (Int, Int) -> (Text, Object)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int, Int) -> Object
forall a. MsgpackEncode a => a -> Object
toMsgpack) Maybe (Int, Int)
bufpos)
    where
      simple :: [(Text, Object)]
simple =
        [
          (Text
"relative" :: Text, FloatRelative -> Object
forall a. MsgpackEncode a => a -> Object
toMsgpack FloatRelative
relative),
          (Text
"width", Int -> Object
forall a. MsgpackEncode a => a -> Object
toMsgpack Int
width),
          (Text
"height", Int -> Object
forall a. MsgpackEncode a => a -> Object
toMsgpack Int
height),
          (Text
"row", Int -> Object
forall a. MsgpackEncode a => a -> Object
toMsgpack Int
row),
          (Text
"col", Int -> Object
forall a. MsgpackEncode a => a -> Object
toMsgpack Int
col),
          (Text
"focusable", Bool -> Object
forall a. MsgpackEncode a => a -> Object
toMsgpack Bool
focusable),
          (Text
"anchor", FloatAnchor -> Object
forall a. MsgpackEncode a => a -> Object
toMsgpack FloatAnchor
anchor),
          (Text
"relative", FloatRelative -> Object
forall a. MsgpackEncode a => a -> Object
toMsgpack FloatRelative
relative)
        ]

instance Default FloatOptions where
  def :: FloatOptions
def =
    FloatRelative
-> Int
-> Int
-> Int
-> Int
-> Bool
-> FloatAnchor
-> Maybe (Int, Int)
-> FloatOptions
FloatOptions FloatRelative
forall a. Default a => a
def Int
30 Int
10 Int
1 Int
1 Bool
False FloatAnchor
forall a. Default a => a
def Maybe (Int, Int)
forall a. Default a => a
def