{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE TypeFamilies #-}

module Cursor.Simple.Map
  ( MapCursor,
    MC.mapCursorList,
    makeMapCursor,
    makeMapCursorWithSelection,
    MC.singletonMapCursorKey,
    MC.singletonMapCursorValue,
    rebuildMapCursor,
    mapMapCursor,
    MC.mapCursorNonEmptyCursorL,
    MC.mapCursorElemL,
    mapCursorSelectKey,
    mapCursorSelectValue,
    mapCursorToggleSelected,
    mapCursorSelectPrev,
    mapCursorSelectNext,
    mapCursorSelectFirst,
    mapCursorSelectLast,
    MC.mapCursorSelection,
    mapCursorSelectIndex,
    MC.mapCursorInsert,
    MC.mapCursorAppend,
    mapCursorInsertAndSelectKey,
    mapCursorAppendAndSelectKey,
    mapCursorInsertAndSelectValue,
    mapCursorAppendAndSelectValue,
    mapCursorRemoveElemAndSelectPrev,
    mapCursorDeleteElemAndSelectNext,
    mapCursorRemoveElem,
    mapCursorDeleteElem,
    mapCursorSearch,
    mapCursorSelectOrAdd,
    module Cursor.Simple.Map.KeyValue,
  )
where

import qualified Cursor.Map as MC
import Cursor.Simple.Map.KeyValue
import Cursor.Types
import Data.List.NonEmpty (NonEmpty (..))

type MapCursor k v = MC.MapCursor k v k v

makeMapCursor :: NonEmpty (k, v) -> MapCursor k v
makeMapCursor :: NonEmpty (k, v) -> MapCursor k v
makeMapCursor = (k -> k) -> NonEmpty (k, v) -> MapCursor k v
forall k kc v vc.
(k -> kc) -> NonEmpty (k, v) -> MapCursor kc vc k v
MC.makeMapCursor k -> k
forall a. a -> a
id

makeMapCursorWithSelection :: Int -> NonEmpty (k, v) -> Maybe (MapCursor k v)
makeMapCursorWithSelection :: Int -> NonEmpty (k, v) -> Maybe (MapCursor k v)
makeMapCursorWithSelection = (k -> k) -> Int -> NonEmpty (k, v) -> Maybe (MapCursor k v)
forall k kc v vc.
(k -> kc) -> Int -> NonEmpty (k, v) -> Maybe (MapCursor kc vc k v)
MC.makeMapCursorWithSelection k -> k
forall a. a -> a
id

rebuildMapCursor :: MapCursor k v -> NonEmpty (k, v)
rebuildMapCursor :: MapCursor k v -> NonEmpty (k, v)
rebuildMapCursor = (k -> k) -> (v -> v) -> MapCursor k v -> NonEmpty (k, v)
forall kc k vc v.
(kc -> k) -> (vc -> v) -> MapCursor kc vc k v -> NonEmpty (k, v)
MC.rebuildMapCursor k -> k
forall a. a -> a
id v -> v
forall a. a -> a
id

mapMapCursor :: (k -> l) -> (v -> w) -> MapCursor k v -> MapCursor l w
mapMapCursor :: (k -> l) -> (v -> w) -> MapCursor k v -> MapCursor l w
mapMapCursor k -> l
f v -> w
g = (k -> l)
-> (v -> w)
-> (k -> l)
-> (v -> w)
-> MapCursor k v
-> MapCursor l w
forall kc lc vc wc k l v w.
(kc -> lc)
-> (vc -> wc)
-> (k -> l)
-> (v -> w)
-> MapCursor kc vc k v
-> MapCursor lc wc l w
MC.mapMapCursor k -> l
f v -> w
g k -> l
f v -> w
g

mapCursorSelectKey :: MapCursor k v -> MapCursor k v
mapCursorSelectKey :: MapCursor k v -> MapCursor k v
mapCursorSelectKey = (k -> k) -> (v -> v) -> MapCursor k v -> MapCursor k v
forall k kc vc v.
(k -> kc)
-> (vc -> v) -> MapCursor kc vc k v -> MapCursor kc vc k v
MC.mapCursorSelectKey k -> k
forall a. a -> a
id v -> v
forall a. a -> a
id

mapCursorSelectValue :: MapCursor k v -> MapCursor k v
mapCursorSelectValue :: MapCursor k v -> MapCursor k v
mapCursorSelectValue = (k -> k) -> (v -> v) -> MapCursor k v -> MapCursor k v
forall kc k v vc.
(kc -> k)
-> (v -> vc) -> MapCursor kc vc k v -> MapCursor kc vc k v
MC.mapCursorSelectValue k -> k
forall a. a -> a
id v -> v
forall a. a -> a
id

mapCursorToggleSelected :: MapCursor k v -> MapCursor k v
mapCursorToggleSelected :: MapCursor k v -> MapCursor k v
mapCursorToggleSelected = (k -> k)
-> (k -> k)
-> (v -> v)
-> (v -> v)
-> MapCursor k v
-> MapCursor k v
forall kc k vc v.
(kc -> k)
-> (k -> kc)
-> (vc -> v)
-> (v -> vc)
-> MapCursor kc vc k v
-> MapCursor kc vc k v
MC.mapCursorToggleSelected k -> k
forall a. a -> a
id k -> k
forall a. a -> a
id v -> v
forall a. a -> a
id v -> v
forall a. a -> a
id

mapCursorSelectPrev :: MapCursor k v -> Maybe (MapCursor k v)
mapCursorSelectPrev :: MapCursor k v -> Maybe (MapCursor k v)
mapCursorSelectPrev = (k -> k)
-> (k -> k) -> (v -> v) -> MapCursor k v -> Maybe (MapCursor k v)
forall kc k vc v.
(kc -> k)
-> (k -> kc)
-> (vc -> v)
-> MapCursor kc vc k v
-> Maybe (MapCursor kc vc k v)
MC.mapCursorSelectPrev k -> k
forall a. a -> a
id k -> k
forall a. a -> a
id v -> v
forall a. a -> a
id

mapCursorSelectNext :: MapCursor k v -> Maybe (MapCursor k v)
mapCursorSelectNext :: MapCursor k v -> Maybe (MapCursor k v)
mapCursorSelectNext = (k -> k)
-> (k -> k) -> (v -> v) -> MapCursor k v -> Maybe (MapCursor k v)
forall kc k vc v.
(kc -> k)
-> (k -> kc)
-> (vc -> v)
-> MapCursor kc vc k v
-> Maybe (MapCursor kc vc k v)
MC.mapCursorSelectNext k -> k
forall a. a -> a
id k -> k
forall a. a -> a
id v -> v
forall a. a -> a
id

mapCursorSelectFirst :: MapCursor k v -> MapCursor k v
mapCursorSelectFirst :: MapCursor k v -> MapCursor k v
mapCursorSelectFirst = (k -> k) -> (k -> k) -> (v -> v) -> MapCursor k v -> MapCursor k v
forall kc k vc v.
(kc -> k)
-> (k -> kc)
-> (vc -> v)
-> MapCursor kc vc k v
-> MapCursor kc vc k v
MC.mapCursorSelectFirst k -> k
forall a. a -> a
id k -> k
forall a. a -> a
id v -> v
forall a. a -> a
id

mapCursorSelectLast :: MapCursor k v -> MapCursor k v
mapCursorSelectLast :: MapCursor k v -> MapCursor k v
mapCursorSelectLast = (k -> k) -> (k -> k) -> (v -> v) -> MapCursor k v -> MapCursor k v
forall kc k vc v.
(kc -> k)
-> (k -> kc)
-> (vc -> v)
-> MapCursor kc vc k v
-> MapCursor kc vc k v
MC.mapCursorSelectLast k -> k
forall a. a -> a
id k -> k
forall a. a -> a
id v -> v
forall a. a -> a
id

mapCursorSelectIndex :: Int -> MapCursor k v -> Maybe (MapCursor k v)
mapCursorSelectIndex :: Int -> MapCursor k v -> Maybe (MapCursor k v)
mapCursorSelectIndex = (k -> k)
-> (k -> k)
-> (v -> v)
-> Int
-> MapCursor k v
-> Maybe (MapCursor k v)
forall kc k vc v.
(kc -> k)
-> (k -> kc)
-> (vc -> v)
-> Int
-> MapCursor kc vc k v
-> Maybe (MapCursor kc vc k v)
MC.mapCursorSelectIndex k -> k
forall a. a -> a
id k -> k
forall a. a -> a
id v -> v
forall a. a -> a
id

mapCursorInsertAndSelectKey :: k -> v -> MapCursor k v -> MapCursor k v
mapCursorInsertAndSelectKey :: k -> v -> MapCursor k v -> MapCursor k v
mapCursorInsertAndSelectKey = (k -> k) -> (v -> v) -> k -> v -> MapCursor k v -> MapCursor k v
forall kc k vc v.
(kc -> k)
-> (vc -> v)
-> kc
-> v
-> MapCursor kc vc k v
-> MapCursor kc vc k v
MC.mapCursorInsertAndSelectKey k -> k
forall a. a -> a
id v -> v
forall a. a -> a
id

mapCursorAppendAndSelectKey :: k -> v -> MapCursor k v -> MapCursor k v
mapCursorAppendAndSelectKey :: k -> v -> MapCursor k v -> MapCursor k v
mapCursorAppendAndSelectKey = (k -> k) -> (v -> v) -> k -> v -> MapCursor k v -> MapCursor k v
forall kc k vc v.
(kc -> k)
-> (vc -> v)
-> kc
-> v
-> MapCursor kc vc k v
-> MapCursor kc vc k v
MC.mapCursorAppendAndSelectKey k -> k
forall a. a -> a
id v -> v
forall a. a -> a
id

mapCursorInsertAndSelectValue :: k -> v -> MapCursor k v -> MapCursor k v
mapCursorInsertAndSelectValue :: k -> v -> MapCursor k v -> MapCursor k v
mapCursorInsertAndSelectValue = (k -> k) -> (v -> v) -> k -> v -> MapCursor k v -> MapCursor k v
forall kc k vc v.
(kc -> k)
-> (vc -> v)
-> k
-> vc
-> MapCursor kc vc k v
-> MapCursor kc vc k v
MC.mapCursorInsertAndSelectValue k -> k
forall a. a -> a
id v -> v
forall a. a -> a
id

mapCursorAppendAndSelectValue :: k -> v -> MapCursor k v -> MapCursor k v
mapCursorAppendAndSelectValue :: k -> v -> MapCursor k v -> MapCursor k v
mapCursorAppendAndSelectValue = (k -> k) -> (v -> v) -> k -> v -> MapCursor k v -> MapCursor k v
forall kc k vc v.
(kc -> k)
-> (vc -> v)
-> k
-> vc
-> MapCursor kc vc k v
-> MapCursor kc vc k v
MC.mapCursorAppendAndSelectValue k -> k
forall a. a -> a
id v -> v
forall a. a -> a
id

mapCursorRemoveElemAndSelectPrev :: MapCursor k v -> Maybe (DeleteOrUpdate (MapCursor k v))
mapCursorRemoveElemAndSelectPrev :: MapCursor k v -> Maybe (DeleteOrUpdate (MapCursor k v))
mapCursorRemoveElemAndSelectPrev = (k -> k) -> MapCursor k v -> Maybe (DeleteOrUpdate (MapCursor k v))
forall k kc vc v.
(k -> kc)
-> MapCursor kc vc k v
-> Maybe (DeleteOrUpdate (MapCursor kc vc k v))
MC.mapCursorRemoveElemAndSelectPrev k -> k
forall a. a -> a
id

mapCursorDeleteElemAndSelectNext :: MapCursor k v -> Maybe (DeleteOrUpdate (MapCursor k v))
mapCursorDeleteElemAndSelectNext :: MapCursor k v -> Maybe (DeleteOrUpdate (MapCursor k v))
mapCursorDeleteElemAndSelectNext = (k -> k) -> MapCursor k v -> Maybe (DeleteOrUpdate (MapCursor k v))
forall k kc vc v.
(k -> kc)
-> MapCursor kc vc k v
-> Maybe (DeleteOrUpdate (MapCursor kc vc k v))
MC.mapCursorDeleteElemAndSelectNext k -> k
forall a. a -> a
id

mapCursorRemoveElem :: MapCursor k v -> DeleteOrUpdate (MapCursor k v)
mapCursorRemoveElem :: MapCursor k v -> DeleteOrUpdate (MapCursor k v)
mapCursorRemoveElem = (k -> k) -> MapCursor k v -> DeleteOrUpdate (MapCursor k v)
forall k kc vc v.
(k -> kc)
-> MapCursor kc vc k v -> DeleteOrUpdate (MapCursor kc vc k v)
MC.mapCursorRemoveElem k -> k
forall a. a -> a
id

mapCursorDeleteElem :: MapCursor k v -> DeleteOrUpdate (MapCursor k v)
mapCursorDeleteElem :: MapCursor k v -> DeleteOrUpdate (MapCursor k v)
mapCursorDeleteElem = (k -> k) -> MapCursor k v -> DeleteOrUpdate (MapCursor k v)
forall k kc vc v.
(k -> kc)
-> MapCursor kc vc k v -> DeleteOrUpdate (MapCursor kc vc k v)
MC.mapCursorDeleteElem k -> k
forall a. a -> a
id

mapCursorSearch :: (k -> v -> Bool) -> MapCursor k v -> Maybe (MapCursor k v)
mapCursorSearch :: (k -> v -> Bool) -> MapCursor k v -> Maybe (MapCursor k v)
mapCursorSearch = (k -> k)
-> (k -> k)
-> (v -> v)
-> (k -> v -> Bool)
-> MapCursor k v
-> Maybe (MapCursor k v)
forall kc k vc v.
(kc -> k)
-> (k -> kc)
-> (vc -> v)
-> (k -> v -> Bool)
-> MapCursor kc vc k v
-> Maybe (MapCursor kc vc k v)
MC.mapCursorSearch k -> k
forall a. a -> a
id k -> k
forall a. a -> a
id v -> v
forall a. a -> a
id

mapCursorSelectOrAdd :: (k -> v -> Bool) -> KeyValueCursor k v -> MapCursor k v -> MapCursor k v
mapCursorSelectOrAdd :: (k -> v -> Bool)
-> KeyValueCursor k v -> MapCursor k v -> MapCursor k v
mapCursorSelectOrAdd = (k -> k)
-> (k -> k)
-> (v -> v)
-> (k -> v -> Bool)
-> KeyValueCursor k v
-> MapCursor k v
-> MapCursor k v
forall kc k vc v.
(kc -> k)
-> (k -> kc)
-> (vc -> v)
-> (k -> v -> Bool)
-> KeyValueCursor kc vc k v
-> MapCursor kc vc k v
-> MapCursor kc vc k v
MC.mapCursorSelectOrAdd k -> k
forall a. a -> a
id k -> k
forall a. a -> a
id v -> v
forall a. a -> a
id