Refactor triplet to Selection datatype
This commit is contained in:
@@ -10,6 +10,7 @@ module Dodge.SelectionSections (
|
||||
inverseSelNumPos,
|
||||
) where
|
||||
|
||||
import Dodge.Data.HUD
|
||||
import Dodge.Data.CardinalPoint
|
||||
import qualified Data.IntSet as IS
|
||||
import Control.Applicative
|
||||
@@ -24,64 +25,52 @@ import Dodge.Data.SelectionList
|
||||
import Dodge.ScreenPos
|
||||
import Geometry.Data
|
||||
|
||||
scrollSelectionSections ::
|
||||
Int ->
|
||||
IMSS a ->
|
||||
Maybe (Int, Int,IS.IntSet) ->
|
||||
Maybe (Int, Int,IS.IntSet)
|
||||
scrollSelectionSections :: Int -> IMSS a -> Maybe Selection -> Maybe Selection
|
||||
scrollSelectionSections yi sss msel
|
||||
| yi == 0 = msel
|
||||
| yi > 0 = foldl' (&) msel $ replicate yi (ssScrollUsing ssLookupUp sss)
|
||||
| otherwise = foldl' (&) msel $ replicate (negate yi) (ssScrollUsing ssLookupDown sss)
|
||||
|
||||
nextInSectionSS ::
|
||||
IM.IntMap (SelectionSection a) ->
|
||||
Maybe (Int, Int, IS.IntSet) ->
|
||||
Maybe (Int, Int, IS.IntSet)
|
||||
nextInSectionSS :: IMSS a -> Maybe Selection -> Maybe Selection
|
||||
nextInSectionSS = ssScrollUsing ssLookupNextMax
|
||||
|
||||
--setFirstPosSelectionSections :: SelectionSections a -> SelectionSections a
|
||||
--setFirstPosSelectionSections sss = fromMaybe sss $ do
|
||||
-- (i, j, _) <- ssLookupMin sss
|
||||
-- return $ sss & sssExtra . sssSelPos ?~ (i, j)
|
||||
|
||||
ssScrollUsing ::
|
||||
(Int -> Int -> IM.IntMap (SelectionSection a) -> Maybe (Int, Int, SelectionItem a)) ->
|
||||
IM.IntMap (SelectionSection a) ->
|
||||
Maybe (Int, Int, IS.IntSet) ->
|
||||
Maybe (Int, Int, IS.IntSet)
|
||||
(Int -> Int -> IMSS a -> Maybe (Int, Int, SelectionItem a)) ->
|
||||
IMSS a ->
|
||||
Maybe Selection ->
|
||||
Maybe Selection
|
||||
ssScrollUsing g =
|
||||
ssScrollMinOnFail
|
||||
g
|
||||
. fmap (ssItems %~ IM.filter _siIsSelectable)
|
||||
|
||||
ssScrollMinOnFail ::
|
||||
(Int -> Int -> IM.IntMap (SelectionSection a) -> Maybe (Int, Int, SelectionItem a)) ->
|
||||
IM.IntMap (SelectionSection a) ->
|
||||
Maybe (Int, Int, IS.IntSet) ->
|
||||
Maybe (Int, Int, IS.IntSet)
|
||||
ssScrollMinOnFail f sss msel = fmap (\(i, j, _) -> (i, j, q i j)) $ l <|> ssLookupMin sss
|
||||
(Int -> Int -> IMSS a -> Maybe (Int, Int, SelectionItem a)) ->
|
||||
IMSS a ->
|
||||
Maybe Selection ->
|
||||
Maybe Selection
|
||||
ssScrollMinOnFail f sss msel = fmap (\(i, j, _) -> Sel i j (q i j)) $ l <|> ssLookupMin sss
|
||||
where
|
||||
q i j = fromMaybe mempty $ do
|
||||
(k,_,xs) <- msel ^? _Just
|
||||
Sel k _ xs <- msel ^? _Just
|
||||
guard $ j `IS.member` xs && i == k
|
||||
return xs
|
||||
l = do
|
||||
(i, j, _) <- msel
|
||||
Sel i j _ <- msel
|
||||
f i j sss
|
||||
|
||||
ssSetCursor ::
|
||||
(IM.IntMap (SelectionSection a) -> Maybe (Int, Int, SelectionItem a)) ->
|
||||
IM.IntMap (SelectionSection a) ->
|
||||
Maybe (Int, Int, IS.IntSet) ->
|
||||
Maybe (Int, Int, IS.IntSet)
|
||||
Maybe Selection ->
|
||||
Maybe Selection
|
||||
ssSetCursor f sss msel = fromMaybe msel $ do
|
||||
(i, j, _) <- f sss
|
||||
let newxs = fromMaybe mempty $ do
|
||||
(k,_,xs) <- msel
|
||||
Sel k _ xs <- msel
|
||||
guard $ k == i && j `IS.member` xs
|
||||
return xs
|
||||
return $ Just (i, j,newxs)
|
||||
return $ Just (Sel i j newxs)
|
||||
|
||||
ssLookupMax :: IM.IntMap (SelectionSection a) -> Maybe (Int, Int, SelectionItem a)
|
||||
ssLookupMax sss = do
|
||||
|
||||
Reference in New Issue
Block a user