mirror of
https://github.com/TheAnachronism/docspell.git
synced 2025-04-05 10:59:33 +00:00
167 lines
2.8 KiB
Elm
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
|