{-# 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