tinytools-0.1.0.4: src/Potato/Flow/OwlItem.hs
module Potato.Flow.OwlItem where
import Relude
import Potato.Flow.SElts
import Potato.Flow.DebugHelpers
data OwlInfo = OwlInfo {
_owlInfo_name :: Text
} deriving (Show, Eq, Generic)
instance NFData OwlInfo
data OwlSubItem =
OwlSubItemNone
| OwlSubItemFolder (Seq REltId)
| OwlSubItemBox SBox
| OwlSubItemLine SAutoLine
| OwlSubItemTextArea STextArea
deriving (Generic, Show, Eq)
instance NFData OwlSubItem
owlSubItem_equivalent :: OwlSubItem -> OwlSubItem -> Bool
owlSubItem_equivalent (OwlSubItemLine slinea) (OwlSubItemLine slineb) = slinea == slineb
owlSubItem_equivalent a b = a == b
data OwlItem = OwlItem {
_owlItem_info :: OwlInfo
, _owlItem_subItem :: OwlSubItem
} deriving (Show, Eq, Generic)
instance NFData OwlItem
instance PotatoShow OwlItem where
potatoShow = \case
OwlItem oinfo (OwlSubItemFolder kiddos) -> "folder: " <> (_owlInfo_name oinfo) <> ": " <> show kiddos
OwlItem oinfo subitem -> "elt: " <> (_owlInfo_name oinfo) <> ": " <> case subitem of
OwlSubItemNone -> "none"
OwlSubItemBox sbox -> show sbox
OwlSubItemLine sline -> show sline
OwlSubItemTextArea stextarea -> show stextarea
class MommyOwl o where
mommyOwl_kiddos :: o -> Maybe (Seq REltId)
mommyOwl_hasKiddos :: o -> Bool
mommyOwl_hasKiddos = isJust . mommyOwl_kiddos
class HasOwlItem o where
hasOwlItem_owlItem :: o -> OwlItem
hasOwlItem_name :: o -> Text
hasOwlItem_name = hasOwlItem_name . hasOwlItem_owlItem
hasOwlItem_isFolder :: o -> Bool
hasOwlItem_isFolder = hasOwlItem_isFolder . hasOwlItem_owlItem
hasOwlItem_attachments :: o -> [Attachment]
hasOwlItem_attachments = hasOwlItem_attachments . hasOwlItem_owlItem
hasOwlItem_toSElt_hack :: o -> SElt
hasOwlItem_toSElt_hack = hasOwlItem_toSElt_hack . hasOwlItem_owlItem
hasOwlItem_toSEltLabel_hack :: o -> SEltLabel
hasOwlItem_toSEltLabel_hack = hasOwlItem_toSEltLabel_hack . hasOwlItem_owlItem
hasOwlItem_toOwlSubItem :: o -> OwlSubItem
hasOwlItem_toOwlSubItem = _owlItem_subItem . hasOwlItem_owlItem
owlItem_name :: OwlItem -> Text
owlItem_name = _owlInfo_name . _owlItem_info
owlItem_setName :: OwlItem -> Text -> OwlItem
owlItem_setName (OwlItem oi x) n = OwlItem (oi { _owlInfo_name = n}) x
instance MommyOwl OwlItem where
mommyOwl_kiddos o = case _owlItem_subItem o of
OwlSubItemFolder kiddos -> Just kiddos
_ -> Nothing
owlSubItem_to_sElt_hack :: OwlSubItem -> SElt
owlSubItem_to_sElt_hack = \case
OwlSubItemFolder _ -> SEltFolderStart
OwlSubItemBox sbox -> SEltBox sbox
OwlSubItemLine sline -> SEltLine sline
OwlSubItemTextArea stextarea -> SEltTextArea stextarea
OwlSubItemNone -> SEltNone
instance HasOwlItem OwlItem where
hasOwlItem_owlItem = id
hasOwlItem_name = owlItem_name
hasOwlItem_isFolder o = case _owlItem_subItem o of
OwlSubItemFolder _ -> True
_ -> False
hasOwlItem_attachments o = case _owlItem_subItem o of
OwlSubItemLine sline -> catMaybes [_sAutoLine_attachStart sline, _sAutoLine_attachEnd sline]
_ -> []
hasOwlItem_toSElt_hack = owlSubItem_to_sElt_hack . _owlItem_subItem
hasOwlItem_toSEltLabel_hack o = SEltLabel (hasOwlItem_name o) (hasOwlItem_toSElt_hack o)
-- DELETE use hasOwlItem variant instead
owlItem_toSElt_hack :: OwlItem -> SElt
owlItem_toSElt_hack = hasOwlItem_toSElt_hack
sElt_to_owlSubItem :: SElt -> OwlSubItem
sElt_to_owlSubItem s = case s of
SEltBox x -> OwlSubItemBox x
SEltLine x -> OwlSubItemLine x
SEltTextArea x -> OwlSubItemTextArea x
SEltNone -> OwlSubItemNone
_ -> error $ "cannot convert " <> show s