{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE ScopedTypeVariables #-}

module DSV.VectorViews
  ( columnNumberView, lookupView
  , columnNumberView_, lookupView_
  ) where

import DSV.IndexError
import DSV.LookupError
import DSV.Numbers
import DSV.Position
import DSV.Prelude
import DSV.Validation
import DSV.Vector
import DSV.ViewType

columnNumberView :: forall a.
    ColumnNumber -> View TooShort (Vector a) a

columnNumberView (ColumnNumber n) =
    View $ \xs ->
        case vectorIndexInt xs (positiveInt n - 1) of
            Nothing -> Failure TooShort
            Just x  -> Success x

columnNumberView_ :: forall a.
    ColumnNumber -> View () (Vector a) a

columnNumberView_ x = discardViewError (columnNumberView x)

lookupView ::
    (a -> Bool)
    -> View LookupError (Vector (a, b)) b

lookupView f =
    View $ \xs ->
        case filter (\(n, _) -> f n) (toList xs) of
            [] -> Failure LookupError_Missing
            [(_, v)] -> Success v
            _ -> Failure LookupError_Duplicate

lookupView_ ::
    (a -> Bool)
    -> View () (Vector (a, b)) b

lookupView_ x = discardViewError (lookupView x)