2022-11-07 17:29:38 +01:00

167 lines
2.8 KiB
Elm

{-
Copyright 2020 Eike K. & Contributors
SPDX-License-Identifier: AGPL-3.0-or-later
-}
module Data.ItemIds exposing
( ItemIdChange
, ItemIds
, apply
, clearAll
, combine
, combineAll
, deselect
, empty
, fromSet
, isEmpty
, isMember
, maybeOne
, noChange
, nonEmpty
, one
, select
, selectAll
, size
, toList
, toQuery
, toggle
, union
)
import Data.ItemQuery exposing (ItemQuery)
import Set exposing (Set)
type ItemIds
= ItemIds (Set String)
empty : ItemIds
empty =
ItemIds Set.empty
isEmpty : ItemIds -> Bool
isEmpty (ItemIds ids) =
Set.isEmpty ids
nonEmpty : ItemIds -> Bool
nonEmpty ids =
not (isEmpty ids)
isMember : ItemIds -> String -> Bool
isMember (ItemIds ids) id =
Set.member id ids
size : ItemIds -> Int
size (ItemIds ids) =
Set.size ids
fromSet : Set String -> ItemIds
fromSet ids =
ItemIds ids
one : String -> ItemIds
one id =
ItemIds (Set.singleton id)
maybeOne : Maybe String -> ItemIds
maybeOne id =
Maybe.map one id |> Maybe.withDefault empty
union : ItemIds -> ItemIds -> ItemIds
union (ItemIds ids1) (ItemIds ids2) =
ItemIds (Set.union ids1 ids2)
toList : ItemIds -> List String
toList (ItemIds ids) =
Set.toList ids
toQuery : ItemIds -> Maybe ItemQuery
toQuery (ItemIds ids) =
if Set.isEmpty ids then
Nothing
else
Just <| Data.ItemQuery.ItemIdIn (Set.toList ids)
--- Change item ids
type ItemIdChange
= ItemIdChange
{ remove : Set String
, add : Set String
, clear : Bool
}
apply : ItemIds -> ItemIdChange -> ItemIds
apply (ItemIds ids) (ItemIdChange { remove, add, clear }) =
if clear then
empty
else
ItemIds (Set.diff ids remove |> Set.union add)
noChange : ItemIdChange
noChange =
ItemIdChange { remove = Set.empty, add = Set.empty, clear = False }
combine : ItemIdChange -> ItemIdChange -> ItemIdChange
combine (ItemIdChange c1) (ItemIdChange c2) =
ItemIdChange
{ remove = Set.union c1.remove c2.remove
, add = Set.union c1.add c2.add
, clear = False
}
combineAll : List ItemIdChange -> ItemIdChange
combineAll all =
List.foldl combine noChange all
select : String -> ItemIdChange
select id =
ItemIdChange { add = Set.singleton id, remove = Set.empty, clear = False }
selectAll : Set String -> ItemIdChange
selectAll ids =
ItemIdChange { add = ids, remove = Set.empty, clear = False }
deselect : String -> ItemIdChange
deselect id =
ItemIdChange { add = Set.empty, remove = Set.singleton id, clear = False }
clearAll : ItemIdChange
clearAll =
ItemIdChange { add = Set.empty, remove = Set.empty, clear = True }
toggle : ItemIds -> String -> ItemIdChange
toggle ids id =
if isMember ids id then
deselect id
else
select id