GroupMapping.purs 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. module PureTabs.Model.GroupMapping where
  2. import Browser.Tabs (WindowId)
  3. import Data.Array as A
  4. import Data.Generic.Rep (class Generic)
  5. import Data.Generic.Rep.Show (genericShow)
  6. import Data.Maybe (fromMaybe, Maybe(..))
  7. import Data.Newtype (class Newtype, unwrap)
  8. import Data.Show (class Show, show)
  9. import Effect.Aff (Aff)
  10. import Effect.Class.Console (error)
  11. import Foreign.Class (class Decode, class Encode)
  12. import Foreign.Generic (defaultOptions, genericDecode, genericEncode)
  13. import Prelude (Unit, bind, flip, map, pure, ($), (/=), (<*), (<>), (==), (>>=), (>>>))
  14. import PureTabs.Browser.Sessions (getWindowValue, setWindowValue)
  15. import PureTabs.Model.Group (GroupId)
  16. newtype GroupData
  17. = GroupData { groupId :: GroupId
  18. , name :: String
  19. }
  20. derive instance genGroupData :: Generic GroupData _
  21. derive instance newtypeGroupData :: Newtype GroupData _
  22. instance showGroupData :: Show GroupData where
  23. show = genericShow
  24. instance encodeGroupData :: Encode GroupData where
  25. encode x = genericEncode (defaultOptions { unwrapSingleConstructors = true }) x
  26. instance decodeGroupData :: Decode GroupData where
  27. decode x = genericDecode (defaultOptions { unwrapSingleConstructors = true }) x
  28. groupData :: GroupId -> String -> GroupData
  29. groupData gid name = GroupData { groupId: gid, name: name }
  30. newtype SavedGroups = SavedGroups (Array GroupData)
  31. derive instance genSavedGroups :: Generic SavedGroups _
  32. derive instance newtypeSavedGroups :: Newtype SavedGroups _
  33. retrieveGroups :: WindowId -> Aff (Array GroupData)
  34. retrieveGroups winId = do
  35. (groups :: (Maybe SavedGroups)) <- getWindowValue winId "groups"
  36. case groups of
  37. Just (SavedGroups groups') -> pure groups'
  38. Nothing -> pure [] <* error ("couldn't get key `groups` for window " <> (show winId))
  39. type GroupsUpdate = (Array GroupData) -> (Array GroupData)
  40. updateGroupsMapping :: WindowId -> GroupsUpdate -> Aff Unit
  41. updateGroupsMapping winId updateGroups = do
  42. groups <- retrieveGroups winId
  43. let updatedGroups = updateGroups groups
  44. setWindowValue winId "groups" updatedGroups
  45. createGroup :: GroupId -> String -> GroupsUpdate
  46. createGroup gid name =
  47. A.filter (unwrap >>> _.groupId >>> (/=) gid)
  48. >>> (flip A.snoc) (groupData gid name)
  49. renameGroup :: GroupId -> String -> GroupsUpdate
  50. renameGroup gid newName =
  51. map $ case _ of
  52. GroupData { groupId: gid' } | gid == gid' -> groupData gid newName
  53. other -> other
  54. moveGroup :: GroupId -> Int -> GroupsUpdate
  55. moveGroup gid to arr =
  56. fromMaybe arr $ do
  57. from <- A.findIndex (unwrap >>> _.groupId >>> (==) gid) arr
  58. group <- arr A.!! from
  59. A.deleteAt from arr >>= A.insertAt to group
  60. deleteGroup :: GroupId -> GroupsUpdate
  61. deleteGroup gid = A.filter (unwrap >>>_.groupId >>> (/=) gid)