{-# LANGUAGE NoImplicitPrelude #-}

module Papa.Lens.Implement.Data.List where

import Control.Lens(Cons, Snoc, Ixed, Index, IxValue, (^?), ix, _head, _tail, _last, _init)
import Data.Maybe(Maybe)

head ::
  Cons s s a a =>
  s
  -> Maybe a
head =
  (^? _head)

tail ::
  Cons s s a a =>
  s
  -> Maybe s
tail =
  (^? _tail)

last ::
  Snoc s s a a =>
  s
  -> Maybe a
last =
  (^? _last)

init ::
  Snoc s s a a =>
  s
  -> Maybe s
init =
  (^? _init)

(!!) ::
  Ixed s =>
  s
  -> Index s
  -> Maybe (IxValue s)
q !! n =
  q ^? ix n

infixl 9 !!