{-# LANGUAGE NoImplicitPrelude #-}

module DSV.LookupUtf8
  ( lookupTextViewUtf8, lookupStringViewUtf8
  , lookupTextViewUtf8_, lookupStringViewUtf8_
  , LookupErrorUtf8 (..)
  ) where

import DSV.ByteString
import DSV.LookupErrorUtf8
import DSV.Prelude
import DSV.Text
import DSV.Validation
import DSV.Vector
import DSV.ViewType
import DSV.UTF8

lookupTextViewUtf8 :: (Text -> Bool)
    -> View LookupErrorUtf8 (Vector (ByteString, ByteString)) Text
lookupTextViewUtf8 = lookupViewUtf8

lookupTextViewUtf8_ :: (Text -> Bool)
    -> View () (Vector (ByteString, ByteString)) Text
lookupTextViewUtf8_ x = discardViewError (lookupTextViewUtf8 x)

lookupStringViewUtf8 :: (String -> Bool)
    -> View LookupErrorUtf8 (Vector (ByteString, ByteString)) String
lookupStringViewUtf8 = lookupViewUtf8

lookupStringViewUtf8_ :: (String -> Bool)
    -> View () (Vector (ByteString, ByteString)) String
lookupStringViewUtf8_ x = discardViewError (lookupStringViewUtf8 x)

lookupViewUtf8 :: DecodeUtf8 a => (a -> Bool)
    -> View LookupErrorUtf8 (Vector (ByteString, ByteString)) a
lookupViewUtf8 f =
    View $ \xs ->
        case filter (\(n, _) -> maybe False f (decodeUtf8Maybe n)) (toList xs) of
            [] -> Failure LookupErrorUtf8_Missing
            [(_, v)] -> maybe (Failure LookupErrorUtf8_Invalid) Success (decodeUtf8Maybe v)
            _ -> Failure LookupErrorUtf8_Duplicate