{-|
The composite works with the field of type 'SaveManagerModel' 'a'.
This structure contains four fields:

- Saved data - sequence of saved objects: 'Seq' ('a', 'Text').
- Current data - the active value 'a'.
- Selected data - 'Maybe' 'Int' position of the selected slot.
When there are no slots, it is 'Nothing'.
- Whether confirmation dialog is currently shown. Used internally.

It should be initialized with 'initSaveManagerModel' 'a' if there is
no need to initialize slots (e.g. from file). Otherwise
'initSaveManagerModel_' should be used.
-}

{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE TemplateHaskell #-}

module Monomer.SaveManager.SaveManagerModel
    ( SaveManagerModel(..)
    , savedData
    , currentData
    , selectedData
    , showConfirmRemove
    , initSaveManagerModel
    , initSaveManagerModel_
    ) where

import Control.Lens
import Data.Sequence (Seq)
import Data.Text (Text)
import qualified Data.Sequence as Seq

data SaveManagerModel a = SaveManagerModel
    { forall a. SaveManagerModel a -> Seq (a, Text)
_smmSavedData :: Seq (a, Text)
    , forall a. SaveManagerModel a -> a
_smmCurrentData :: a
    , forall a. SaveManagerModel a -> Maybe Int
_smmSelectedData :: Maybe Int
    , forall a. SaveManagerModel a -> Bool
_smmShowConfirmRemove :: Bool
    } deriving SaveManagerModel a -> SaveManagerModel a -> Bool
forall a. Eq a => SaveManagerModel a -> SaveManagerModel a -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: SaveManagerModel a -> SaveManagerModel a -> Bool
$c/= :: forall a. Eq a => SaveManagerModel a -> SaveManagerModel a -> Bool
== :: SaveManagerModel a -> SaveManagerModel a -> Bool
$c== :: forall a. Eq a => SaveManagerModel a -> SaveManagerModel a -> Bool
Eq

makeLensesWith abbreviatedFields 'SaveManagerModel

{-|
Receives a value and returns composite model with no slots.
-}
initSaveManagerModel :: a -> (SaveManagerModel a)
initSaveManagerModel :: forall a. a -> SaveManagerModel a
initSaveManagerModel a
v = forall a. a -> Seq (a, Text) -> SaveManagerModel a
initSaveManagerModel_ a
v forall a. Seq a
Seq.empty

{-|
Receives a value with slots and returns composite model.
-}
initSaveManagerModel_ :: a -> Seq (a, Text) -> (SaveManagerModel a)
initSaveManagerModel_ :: forall a. a -> Seq (a, Text) -> SaveManagerModel a
initSaveManagerModel_ a
initData Seq (a, Text)
slots = SaveManagerModel
    { _smmSavedData :: Seq (a, Text)
_smmSavedData = Seq (a, Text)
slots
    , _smmCurrentData :: a
_smmCurrentData = a
initData
    , _smmSelectedData :: Maybe Int
_smmSelectedData = forall a. Maybe a
Nothing
    , _smmShowConfirmRemove :: Bool
_smmShowConfirmRemove = Bool
False
    }