{-# LANGUAGE ViewPatterns #-}
module Text.Pandoc.Readers.ODT.Generic.Utils
( tryToRead
, Lookupable(..)
, readLookupable
, readPercent
, findBy
) where
import Data.Char (isSpace)
import Data.Maybe
import Data.Text (Text)
import qualified Data.Text as T
tryToRead :: (Read r) => Text -> Maybe r
tryToRead :: forall r. Read r => Text -> Maybe r
tryToRead = ((r, String) -> r) -> Maybe (r, String) -> Maybe r
forall a b. (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (r, String) -> r
forall a b. (a, b) -> a
fst (Maybe (r, String) -> Maybe r)
-> (Text -> Maybe (r, String)) -> Text -> Maybe r
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(r, String)] -> Maybe (r, String)
forall a. [a] -> Maybe a
listToMaybe ([(r, String)] -> Maybe (r, String))
-> (Text -> [(r, String)]) -> Text -> Maybe (r, String)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ReadS r
forall a. Read a => ReadS a
reads ReadS r -> (Text -> String) -> Text -> [(r, String)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Text -> String
T.unpack
readPercent :: ReadS Int
readPercent :: ReadS Int
readPercent String
s = [ (Int
i,String
s') | (Int
i , String
r ) <- ReadS Int
forall a. Read a => ReadS a
reads String
s
, (String
"%" , String
s') <- ReadS String
lex String
r
]
class Lookupable a where
lookupTable :: [(Text, a)]
readLookupable :: (Lookupable a) => Text -> Maybe a
readLookupable :: forall a. Lookupable a => Text -> Maybe a
readLookupable Text
s =
Text -> [(Text, a)] -> Maybe a
forall a b. Eq a => a -> [(a, b)] -> Maybe b
lookup ((Char -> Bool) -> Text -> Text
T.takeWhile (Bool -> Bool
not (Bool -> Bool) -> (Char -> Bool) -> Char -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Char -> Bool
isSpace) (Text -> Text) -> Text -> Text
forall a b. (a -> b) -> a -> b
$ (Char -> Bool) -> Text -> Text
T.dropWhile Char -> Bool
isSpace Text
s) [(Text, a)]
forall a. Lookupable a => [(Text, a)]
lookupTable
findBy :: (a -> Maybe b) -> [a] -> Maybe b
findBy :: forall a b. (a -> Maybe b) -> [a] -> Maybe b
findBy a -> Maybe b
_ [] = Maybe b
forall a. Maybe a
Nothing
findBy a -> Maybe b
f ((a -> Maybe b
f -> Just b
x):[a]
_ ) = b -> Maybe b
forall a. a -> Maybe a
Just b
x
findBy a -> Maybe b
f ( a
_:[a]
xs) = (a -> Maybe b) -> [a] -> Maybe b
forall a b. (a -> Maybe b) -> [a] -> Maybe b
findBy a -> Maybe b
f [a]
xs