{-# LANGUAGE Trustworthy #-}

-- |
-- Module      : Data.Text.Short.Partial
-- Copyright   : © Herbert Valerio Riedel 2018
-- License     : BSD3
--
-- Maintainer  : hvr@gnu.org
-- Stability   : stable
--
-- Partial functions vocabulary
--
-- This module provides common partial functions for operating on 'ShortText'.
--
-- The use of these functions is discouraged as they tend to be error-prone.
--
-- @since 0.1.2
module Data.Text.Short.Partial
    ( head
    , tail
    , init
    , last
    , index

    , foldl1
    , foldl1'
    , foldr1
    ) where

import           Data.Text.Short
import           Data.Text.Short.Internal
import           Prelude                  ()

-- | \(\mathcal{O}(1)\) Returns first character of a non-empty 'ShortText'
--
-- >>> head "abcd"
-- 'a'
--
-- __Note__: Will throw an 'error' exception for empty 'ShortText's.
-- Consider using the total functions 'uncons' or 'indexMaybe'
-- instead.
--
-- @since 0.1.2
head :: ShortText -> Char
head = maybe (error "head: empty ShortText") fst . uncons

-- | \(\mathcal{O}(n)\) Drop first character from non-empty 'ShortText'.
--
-- >>> tail "abcd"
-- "bcd"
--
-- __Note__: Will throw an 'error' exception for empty 'ShortText's.
-- Consider using the total functions 'uncons' or 'drop' instead.
--
-- @since 0.1.2
tail :: ShortText -> ShortText
tail = maybe (error "tail: empty ShortText") snd . uncons

-- | \(\mathcal{O}(n)\) Drop last character from non-empty 'ShortText'.
--
-- >>> tail "abcd"
-- "bcd"
--
-- __Note__: Will throw an 'error' exception for empty 'ShortText's.
-- Consider using the total functions 'unsnoc' or 'dropEnd' instead.
--
-- @since 0.1.2
init :: ShortText -> ShortText
init = maybe (error "init: empty ShortText") fst . unsnoc

-- | \(\mathcal{O}(1)\) Return last character from non-empty 'ShortText'.
--
-- >>> last "abcd"
-- 'd'
--
-- __Note__: Will throw an 'error' exception for empty 'ShortText's.
-- Consider using the total functions 'unsnoc' or 'indexEndMaybe'
-- instead.
--
-- @since 0.1.2
last :: ShortText -> Char
last = maybe (error "last: empty ShortText") snd . unsnoc

-- | \(\mathcal{O}(n)\) Retrieve \(i\)-th character (code-point)
--
-- >>> index "abcd" 1
-- 'b'
--
-- __Note__: Will throw an 'error' exception if index is out of
-- bounds.  Consider using the total functions 'indexMaybe' or
-- 'indexEndMaybe' instead.
--
-- @since 0.1.2
index :: ShortText -> Int -> Char
index st i = case indexMaybe st i of
               Nothing -> error "index: not within ShortText"
               Just c  -> c

-- $setup
-- >>> :set -XOverloadedStrings