-- |
-- Module      :  Conllu.Utils
-- Copyright   :  © 2018 bruno cuconato
-- License     :  LPGL-3
--
-- Maintainer  :  bruno cuconato <bcclaro+hackage@gmail.com>
-- Stability   :  experimental
-- Portability :  non-portable
--
-- the library's utility functions.

module Conllu.Utils where

import Control.Exception.Base
import Data.Char
import Data.Maybe

---
-- char functions
upcaseStr :: String -> String
upcaseStr :: String -> String
upcaseStr = (Char -> Char) -> String -> String
forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
toUpper

downcaseStr :: String -> String
downcaseStr :: String -> String
downcaseStr = (Char -> Char) -> String -> String
forall a b. (a -> b) -> [a] -> [b]
map Char -> Char
toLower

---
-- assertions
assNothing :: Maybe a -> Bool -> Bool
assNothing :: Maybe a -> Bool -> Bool
assNothing Maybe a
m = Bool -> Bool -> Bool
forall a. (?callStack::CallStack) => Bool -> a -> a
assert (Maybe a -> Bool
forall a. Maybe a -> Bool
isNothing Maybe a
m)

assSomething :: Maybe a -> Bool -> Bool
assSomething :: Maybe a -> Bool -> Bool
assSomething Maybe a
m = Bool -> Bool -> Bool
forall a. (?callStack::CallStack) => Bool -> a -> a
assert (Maybe a -> Bool
forall a. Maybe a -> Bool
isJust Maybe a
m)

assNull :: [a] -> Bool -> Bool
assNull :: [a] -> Bool -> Bool
assNull [a]
l = Bool -> Bool -> Bool
forall a. (?callStack::CallStack) => Bool -> a -> a
assert ([a] -> Bool
forall (t :: * -> *) a. Foldable t => t a -> Bool
null [a]
l)

---
-- function tools
if' :: Bool -> a -> a -> a
if' :: Bool -> a -> a -> a
if' Bool
True  a
x  a
_b = a
x
if' Bool
False a
_b a
y  = a
y

consIf :: (a -> Bool) -> a -> [a] -> [a]
-- | cons value if it satisfies the predicate, else do nothing.
consIf :: (a -> Bool) -> a -> [a] -> [a]
consIf a -> Bool
p a
a [a]
as =
  if a -> Bool
p a
a
    then a
a a -> [a] -> [a]
forall a. a -> [a] -> [a]
: [a]
as
    else [a]
as

---
-- safe functions
safehead :: [a] -> Maybe a
safehead :: [a] -> Maybe a
safehead [] = Maybe a
forall a. Maybe a
Nothing
safehead (a
x:[a]
_) = a -> Maybe a
forall a. a -> Maybe a
Just a
x

safeRead :: Read a => String -> Maybe a
safeRead :: String -> Maybe a
safeRead = ((a, String) -> a) -> Maybe (a, String) -> Maybe a
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (a, String) -> a
forall a b. (a, b) -> a
fst (Maybe (a, String) -> Maybe a)
-> (String -> Maybe (a, String)) -> String -> Maybe a
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(a, String)] -> Maybe (a, String)
forall a. [a] -> Maybe a
listToMaybe ([(a, String)] -> Maybe (a, String))
-> (String -> [(a, String)]) -> String -> Maybe (a, String)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [(a, String)]
forall a. Read a => ReadS a
reads