{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE MultiWayIf #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
module Zenacy.HTML.Internal.Core
( updateSTRef
, rref
, wref
, uref
, findSucc
, insertBefore
, removeFirst
, textExtract
, textBlank
, textReadDec
) where
import Data.Text
( Text
)
import qualified Data.Text as T
( breakOn
, drop
, length
, null
, replicate
, singleton
, unpack
)
import Control.Monad.ST
( ST
)
import Data.STRef
( STRef
, readSTRef
, writeSTRef
)
import qualified Numeric as N
( readDec
)
updateSTRef :: STRef s a -> (a -> a) -> ST s ()
updateSTRef :: forall s a. STRef s a -> (a -> a) -> ST s ()
updateSTRef STRef s a
r a -> a
f = forall s a. STRef s a -> ST s a
readSTRef STRef s a
r forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= forall s a. STRef s a -> a -> ST s ()
writeSTRef STRef s a
r forall b c a. (b -> c) -> (a -> b) -> a -> c
. a -> a
f
{-# INLINE updateSTRef #-}
rref :: STRef s a -> ST s a
rref :: forall s a. STRef s a -> ST s a
rref = forall s a. STRef s a -> ST s a
readSTRef
{-# INLINE rref #-}
wref :: STRef s a -> a -> ST s ()
wref :: forall s a. STRef s a -> a -> ST s ()
wref = forall s a. STRef s a -> a -> ST s ()
writeSTRef
{-# INLINE wref #-}
uref :: STRef s a -> (a -> a) -> ST s ()
uref :: forall s a. STRef s a -> (a -> a) -> ST s ()
uref = forall s a. STRef s a -> (a -> a) -> ST s ()
updateSTRef
{-# INLINE uref #-}
findSucc :: (a -> Bool) -> [a] -> Maybe a
findSucc :: forall a. (a -> Bool) -> [a] -> Maybe a
findSucc a -> Bool
p [] = forall a. Maybe a
Nothing
findSucc a -> Bool
p (a
y:a
x:[a]
xs) = if a -> Bool
p a
y then forall a. a -> Maybe a
Just a
x else forall a. (a -> Bool) -> [a] -> Maybe a
findSucc a -> Bool
p (a
xforall a. a -> [a] -> [a]
:[a]
xs)
findSucc a -> Bool
p (a
x:[a]
xs) = forall a. (a -> Bool) -> [a] -> Maybe a
findSucc a -> Bool
p [a]
xs
insertBefore :: (a -> Bool) -> a -> [a] -> [a]
insertBefore :: forall a. (a -> Bool) -> a -> [a] -> [a]
insertBefore a -> Bool
f a
_ [] = []
insertBefore a -> Bool
f a
x (a
y:[a]
ys) = if a -> Bool
f a
y then a
x forall a. a -> [a] -> [a]
: a
y forall a. a -> [a] -> [a]
: [a]
ys else a
y forall a. a -> [a] -> [a]
: forall a. (a -> Bool) -> a -> [a] -> [a]
insertBefore a -> Bool
f a
x [a]
ys
removeFirst :: (a -> Bool) -> [a] -> [a]
removeFirst :: forall a. (a -> Bool) -> [a] -> [a]
removeFirst a -> Bool
p [] = []
removeFirst a -> Bool
p (a
x:[a]
xs) = if a -> Bool
p a
x then [a]
xs else a
x forall a. a -> [a] -> [a]
: forall a. (a -> Bool) -> [a] -> [a]
removeFirst a -> Bool
p [a]
xs
textExtract :: Text -> Text -> Text -> Maybe Text
Text
d0 Text
d1 Text
t
| Text -> Bool
T.null Text
b = forall a. Maybe a
Nothing
| Text -> Bool
T.null Text
y = forall a. Maybe a
Nothing
| Text -> Bool
T.null Text
x = forall a. Maybe a
Nothing
| Bool
otherwise = forall a. a -> Maybe a
Just Text
x
where
(Text
a,Text
b) = Text -> Text -> (Text, Text)
T.breakOn Text
d0 Text
t
(Text
x,Text
y) = Text -> Text -> (Text, Text)
T.breakOn Text
d1 forall a b. (a -> b) -> a -> b
$ Int -> Text -> Text
T.drop (Text -> Int
T.length Text
d0) Text
b
textBlank :: Int -> Text
textBlank :: Int -> Text
textBlank Int
x = Int -> Text -> Text
T.replicate Int
x (Char -> Text
T.singleton Char
' ')
textReadDec :: Text -> Maybe Int
textReadDec :: Text -> Maybe Int
textReadDec Text
x =
case forall a. (Eq a, Num a) => ReadS a
N.readDec (Text -> String
T.unpack Text
x) of
[(Int
a,String
_)] -> forall a. a -> Maybe a
Just Int
a
[(Int, String)]
_otherwise -> forall a. Maybe a
Nothing