{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE DeriveFunctor #-}

module Cursor.Simple.List.NonEmpty
  ( NonEmptyCursor
  , NEC.nonEmptyCursorPrev
  , NEC.nonEmptyCursorCurrent
  , NEC.nonEmptyCursorNext
  , makeNonEmptyCursor
  , makeNonEmptyCursorWithSelection
  , NEC.singletonNonEmptyCursor
  , rebuildNonEmptyCursor
  , mapNonEmptyCursor
  , NEC.nonEmptyCursorElemL
  , nonEmptyCursorSelectPrev
  , nonEmptyCursorSelectNext
  , nonEmptyCursorSelectFirst
  , nonEmptyCursorSelectLast
  , NEC.nonEmptyCursorSelection
  , nonEmptyCursorSelectIndex
  , NEC.nonEmptyCursorInsert
  , NEC.nonEmptyCursorAppend
  , nonEmptyCursorInsertAndSelect
  , nonEmptyCursorAppendAndSelect
  , NEC.nonEmptyCursorInsertAtStart
  , NEC.nonEmptyCursorAppendAtEnd
  , nonEmptyCursorInsertAtStartAndSelect
  , nonEmptyCursorAppendAtEndAndSelect
  , nonEmptyCursorRemoveElemAndSelectPrev
  , nonEmptyCursorDeleteElemAndSelectNext
  , nonEmptyCursorRemoveElem
  , nonEmptyCursorDeleteElem
  , nonEmptyCursorSearch
  , nonEmptyCursorSelectOrAdd
  ) where

import Data.List.NonEmpty (NonEmpty(..))

import Cursor.Types

import qualified Cursor.List.NonEmpty as NEC

-- | A 'nonempty list' cursor
type NonEmptyCursor a = NEC.NonEmptyCursor a a

makeNonEmptyCursor :: NonEmpty a -> NonEmptyCursor a
makeNonEmptyCursor = NEC.makeNonEmptyCursor id

makeNonEmptyCursorWithSelection :: Int -> NonEmpty a -> Maybe (NonEmptyCursor a)
makeNonEmptyCursorWithSelection = NEC.makeNonEmptyCursorWithSelection id

rebuildNonEmptyCursor :: NonEmptyCursor a -> NonEmpty a
rebuildNonEmptyCursor = NEC.rebuildNonEmptyCursor id

mapNonEmptyCursor :: (a -> b) -> NonEmptyCursor a -> NonEmptyCursor b
mapNonEmptyCursor f = NEC.mapNonEmptyCursor f f

nonEmptyCursorSelectPrev :: NonEmptyCursor a -> Maybe (NonEmptyCursor a)
nonEmptyCursorSelectPrev = NEC.nonEmptyCursorSelectPrev id id

nonEmptyCursorSelectNext :: NonEmptyCursor a -> Maybe (NonEmptyCursor a)
nonEmptyCursorSelectNext = NEC.nonEmptyCursorSelectNext id id

nonEmptyCursorSelectFirst :: NonEmptyCursor a -> NonEmptyCursor a
nonEmptyCursorSelectFirst = NEC.nonEmptyCursorSelectFirst id id

nonEmptyCursorSelectLast :: NonEmptyCursor a -> NonEmptyCursor a
nonEmptyCursorSelectLast = NEC.nonEmptyCursorSelectLast id id

nonEmptyCursorSelectIndex :: Int -> NonEmptyCursor a -> Maybe (NonEmptyCursor a)
nonEmptyCursorSelectIndex = NEC.nonEmptyCursorSelectIndex id id

nonEmptyCursorInsertAndSelect :: a -> NonEmptyCursor a -> NonEmptyCursor a
nonEmptyCursorInsertAndSelect = NEC.nonEmptyCursorInsertAndSelect id

nonEmptyCursorAppendAndSelect :: a -> NonEmptyCursor a -> NonEmptyCursor a
nonEmptyCursorAppendAndSelect = NEC.nonEmptyCursorAppendAndSelect id

nonEmptyCursorInsertAtStartAndSelect ::
     a -> NonEmptyCursor a -> NonEmptyCursor a
nonEmptyCursorInsertAtStartAndSelect =
  NEC.nonEmptyCursorInsertAtStartAndSelect id id

nonEmptyCursorAppendAtEndAndSelect :: a -> NonEmptyCursor a -> NonEmptyCursor a
nonEmptyCursorAppendAtEndAndSelect =
  NEC.nonEmptyCursorAppendAtEndAndSelect id id

nonEmptyCursorRemoveElemAndSelectPrev ::
     NonEmptyCursor a -> Maybe (DeleteOrUpdate (NonEmptyCursor a))
nonEmptyCursorRemoveElemAndSelectPrev =
  NEC.nonEmptyCursorRemoveElemAndSelectPrev id

nonEmptyCursorDeleteElemAndSelectNext ::
     NonEmptyCursor a -> Maybe (DeleteOrUpdate (NonEmptyCursor a))
nonEmptyCursorDeleteElemAndSelectNext =
  NEC.nonEmptyCursorDeleteElemAndSelectNext id

nonEmptyCursorRemoveElem ::
     NonEmptyCursor a -> DeleteOrUpdate (NonEmptyCursor a)
nonEmptyCursorRemoveElem = NEC.nonEmptyCursorRemoveElem id

nonEmptyCursorDeleteElem ::
     NonEmptyCursor a -> DeleteOrUpdate (NonEmptyCursor a)
nonEmptyCursorDeleteElem = NEC.nonEmptyCursorDeleteElem id

nonEmptyCursorSearch ::
     (a -> Bool) -> NonEmptyCursor a -> Maybe (NonEmptyCursor a)
nonEmptyCursorSearch = NEC.nonEmptyCursorSearch id id

nonEmptyCursorSelectOrAdd ::
     (a -> Bool) -> a -> NonEmptyCursor a -> NonEmptyCursor a
nonEmptyCursorSelectOrAdd = NEC.nonEmptyCursorSelectOrAdd id id