module UVMHS.Core.Data.String where import UVMHS.Core.Init import UVMHS.Core.Classes import UVMHS.Core.Data.Arithmetic () import qualified Data.Text as Text import qualified Data.Text.Internal.Fusion as TextI import qualified Data.Text.Lazy as TextLazy import qualified Data.Text.Lazy.Builder as TextBuilder import qualified Prelude as HS instance Null π where null :: π null = π Text.empty instance Append π where β§Ί :: π -> π -> π (β§Ί) = π -> π -> π Text.append instance Monoid π instance Single β π where single :: β -> π single = β -> π Text.singleton instance ToIter β π where iter :: π -> πΌ β iter π cs = (forall b. (β -> b -> (b -> b) -> b) -> b -> (b -> b) -> b) -> πΌ β forall a. (forall b. (a -> b -> (b -> b) -> b) -> b -> (b -> b) -> b) -> πΌ a πΌ ((forall b. (β -> b -> (b -> b) -> b) -> b -> (b -> b) -> b) -> πΌ β) -> (forall b. (β -> b -> (b -> b) -> b) -> b -> (b -> b) -> b) -> πΌ β forall a b. (a -> b) -> a -> b HS.$ \ β -> b -> (b -> b) -> b f β ((b -> b) -> b -> b) -> b -> (b -> b) -> b forall a b c. (a -> b -> c) -> b -> a -> c flip (((b -> b) -> b -> b) -> b -> (b -> b) -> b) -> ((b -> b) -> b -> b) -> b -> (b -> b) -> b forall a b. (a -> b) -> a -> b $ \ b -> b π β case π -> Stream β TextI.stream π cs of TextI.Stream s -> Step s β g s sβ Size _ β let loop :: s -> b -> b loop s s b i = case s -> Step s β g s s of Step s β TextI.Done β b -> b π b i TextI.Skip s s' β s -> b -> b loop s s' b i TextI.Yield β c s s' β β -> b -> (b -> b) -> b f β c b i ((b -> b) -> b) -> (b -> b) -> b forall a b. (a -> b) -> a -> b $ \ b i' β s -> b -> b loop s s' b i' in s -> b -> b loop s sβ instance Lookup β β π where π s β? :: π -> β -> π β β? β n | (β n β -> β -> πΉ forall a. Ord a => a -> a -> πΉ > β 0) πΉ -> πΉ -> πΉ β© (β n β -> β -> πΉ forall a. Ord a => a -> a -> πΉ β€ π -> β lengthπ π s) = β -> π β forall a. a -> π a Some (β -> π β) -> β -> π β forall a b. (a -> b) -> a -> b $ HasCallStack => π -> Int -> β π -> Int -> β Text.index π s (Int -> β) -> Int -> β forall a b. (a -> b) -> a -> b $ β -> Int forall a b. (Integral a, Num b) => a -> b HS.fromIntegral (β -> Int) -> β -> Int forall a b. (a -> b) -> a -> b $ β n β -> β -> β forall a. Minus a => a -> a -> a - β 1 | πΉ otherwise = π β forall a. π a None emptyπ β· π β πΉ emptyπ :: π -> πΉ emptyπ = π -> πΉ Text.null singleπ β· β β π singleπ :: β -> π singleπ = β -> π Text.singleton buildπC β· (ToIter β t) β t β π buildπC :: forall t. ToIter β t => t -> π buildπC = String -> π Text.pack (String -> π) -> (πΌ β -> String) -> πΌ β -> π forall b c a. (b -> c) -> (a -> b) -> a -> c β πΌ β -> String forall a. πΌ a -> [a] lazyListπΌ (πΌ β -> π) -> (t -> πΌ β) -> t -> π forall b c a. (b -> c) -> (a -> b) -> a -> c β t -> πΌ β forall a t. ToIter a t => t -> πΌ a iter buildπS β· (ToIter π t) β t β π buildπS :: forall t. ToIter π t => t -> π buildπS = Text -> π TextLazy.toStrict (Text -> π) -> (Builder -> Text) -> Builder -> π forall b c a. (b -> c) -> (a -> b) -> a -> c β Builder -> Text TextBuilder.toLazyText (Builder -> π) -> (πΌ π -> Builder) -> πΌ π -> π forall b c a. (b -> c) -> (a -> b) -> a -> c β Builder -> (π -> Builder -> Builder) -> πΌ π -> Builder forall b a. b -> (a -> b -> b) -> πΌ a -> b foldrπΌ Builder forall a. Monoid a => a HS.mempty (Builder -> Builder -> Builder forall a. Monoid a => a -> a -> a HS.mappend (Builder -> Builder -> Builder) -> (π -> Builder) -> π -> Builder -> Builder forall b c a. (b -> c) -> (a -> b) -> a -> c β π -> Builder TextBuilder.fromText) (πΌ π -> π) -> (t -> πΌ π) -> t -> π forall b c a. (b -> c) -> (a -> b) -> a -> c β t -> πΌ π forall a t. ToIter a t => t -> πΌ a iter buildπCN β· (ToIter β t) β β64 β t β π buildπCN :: forall t. ToIter β t => β64 -> t -> π buildπCN β64 n = Text -> π TextLazy.toStrict (Text -> π) -> (Builder -> Text) -> Builder -> π forall b c a. (b -> c) -> (a -> b) -> a -> c β Int -> Builder -> Text TextBuilder.toLazyTextWith (β64 -> Int forall a b. (Integral a, Num b) => a -> b HS.fromIntegral β64 n) (Builder -> π) -> (πΌ β -> Builder) -> πΌ β -> π forall b c a. (b -> c) -> (a -> b) -> a -> c β Builder -> (β -> Builder -> Builder) -> πΌ β -> Builder forall b a. b -> (a -> b -> b) -> πΌ a -> b foldrπΌ Builder forall a. Monoid a => a HS.mempty (Builder -> Builder -> Builder forall a. Monoid a => a -> a -> a HS.mappend (Builder -> Builder -> Builder) -> (β -> Builder) -> β -> Builder -> Builder forall b c a. (b -> c) -> (a -> b) -> a -> c β β -> Builder TextBuilder.singleton) (πΌ β -> π) -> (t -> πΌ β) -> t -> π forall b c a. (b -> c) -> (a -> b) -> a -> c β t -> πΌ β forall a t. ToIter a t => t -> πΌ a iter buildπSN β· (ToIter π t) β β64 β t β π buildπSN :: forall t. ToIter π t => β64 -> t -> π buildπSN β64 n = Text -> π TextLazy.toStrict (Text -> π) -> (Builder -> Text) -> Builder -> π forall b c a. (b -> c) -> (a -> b) -> a -> c β Int -> Builder -> Text TextBuilder.toLazyTextWith (β64 -> Int forall a b. (Integral a, Num b) => a -> b HS.fromIntegral β64 n) (Builder -> π) -> (πΌ π -> Builder) -> πΌ π -> π forall b c a. (b -> c) -> (a -> b) -> a -> c β Builder -> (π -> Builder -> Builder) -> πΌ π -> Builder forall b a. b -> (a -> b -> b) -> πΌ a -> b foldrπΌ Builder forall a. Monoid a => a HS.mempty (Builder -> Builder -> Builder forall a. Monoid a => a -> a -> a HS.mappend (Builder -> Builder -> Builder) -> (π -> Builder) -> π -> Builder -> Builder forall b c a. (b -> c) -> (a -> b) -> a -> c β π -> Builder TextBuilder.fromText) (πΌ π -> π) -> (t -> πΌ π) -> t -> π forall b c a. (b -> c) -> (a -> b) -> a -> c β t -> πΌ π forall a t. ToIter a t => t -> πΌ a iter showπ β· (Show a) β a β π showπ :: forall a. Show a => a -> π showπ = String -> π frhsChars (String -> π) -> (a -> String) -> a -> π forall b c a. (b -> c) -> (a -> b) -> a -> c β a -> String forall a. Show a => a -> String HS.show readπ β· (HS.Read a) β π β a readπ :: forall a. Read a => π -> a readπ = String -> a forall a. Read a => String -> a HS.read (String -> a) -> (π -> String) -> π -> a forall b c a. (b -> c) -> (a -> b) -> a -> c β π -> String tohsChars lowerπ β· π β π lowerπ :: π -> π lowerπ = π -> π Text.toLower upperπ β· π β π upperπ :: π -> π upperπ = π -> π Text.toUpper isEmptyπ β· π β πΉ isEmptyπ :: π -> πΉ isEmptyπ = π -> πΉ Text.null lengthπ β· π β β lengthπ :: π -> β lengthπ = β€64 -> β forall a. (ToNatO a, HasCallStack) => a -> β natΞ© (β€64 -> β) -> (Int -> β€64) -> Int -> β forall b c a. (b -> c) -> (a -> b) -> a -> c β Int -> β€64 forall a b. CHS a b => b -> a frhs (Int -> β) -> (π -> Int) -> π -> β forall b c a. (b -> c) -> (a -> b) -> a -> c β π -> Int Text.length length64π β· π β β64 length64π :: π -> β64 length64π = β€64 -> β64 forall a. (ToNatO64 a, HasCallStack) => a -> β64 natΞ©64 (β€64 -> β64) -> (Int -> β€64) -> Int -> β64 forall b c a. (b -> c) -> (a -> b) -> a -> c β Int -> β€64 forall a b. CHS a b => b -> a frhs (Int -> β64) -> (π -> Int) -> π -> β64 forall b c a. (b -> c) -> (a -> b) -> a -> c β π -> Int Text.length splitOnπ β· π β π β πΌ π splitOnπ :: π -> π -> πΌ π splitOnπ π i π s = [π] -> πΌ π forall a. [a] -> πΌ a iterLL ([π] -> πΌ π) -> [π] -> πΌ π forall a b. (a -> b) -> a -> b $ HasCallStack => π -> π -> [π] π -> π -> [π] Text.splitOn π i π s replaceπ β· π β π β π β π replaceπ :: π -> π -> π -> π replaceπ = HasCallStack => π -> π -> π -> π π -> π -> π -> π Text.replace