~jaro/balkon

7bc4ab57fb1fa08d10db5c12909785a553cf1cc6 β€” Jaro 1 year, 8 months ago 93f749d
Make ParagraphConstruction more efficient.
1 files changed, 12 insertions(+), 11 deletions(-)

M test/Data/Text/ParagraphLayout/ParagraphConstruction.hs
M test/Data/Text/ParagraphLayout/ParagraphConstruction.hs => test/Data/Text/ParagraphLayout/ParagraphConstruction.hs +12 -11
@@ 1,12 1,10 @@
-- | Infix operators for readable construction of paragraphs as testing input.
-- | Infix operators for construction of paragraphs with readable code.
--
-- Example construction:
-- @"ignored prefix" |< "en"~"one two " >|< "ja"~"δΈ‰ε››" >| "ignored suffix"@
--
-- Special syntax for paragraphs with no contents:
-- @"ignored prefix" |<>| "ignored suffix"@
--
-- Please note that this form of construction is inefficient for longer text.
module Data.Text.ParagraphLayout.ParagraphConstruction
    ((>|)
    ,(>|<)


@@ 16,9 14,12 @@ module Data.Text.ParagraphLayout.ParagraphConstruction
    )
where

import Data.Text (append, pack)
import Data.Text (pack)
import Data.Text.Foreign (lengthWord8)
import Data.Text.Internal (Text(Text))
import Data.Text.Internal.Lazy (chunk, empty)
import qualified Data.Text.Internal.Lazy as Lazy
import Data.Text.Lazy (toStrict)
import Data.Text.ParagraphLayout.Plain
    (Paragraph(Paragraph)
    ,ParagraphOptions


@@ 27,38 28,38 @@ import Data.Text.ParagraphLayout.Plain

-- | Create first span with optional ignored suffix.
infixr 5 >|
(>|) :: (String, String) -> String -> (Text, [Span])
(>|) :: (String, String) -> String -> (Lazy.Text, [Span])
(spanLanguage, spanText) >| suffix = (newText, newSpans)
    where
        newSpans = [newSpan]
        newSpan = Span (lengthWord8 packedSpanText) spanLanguage
        newText = append packedSpanText packedSuffix
        newText = chunk packedSpanText (chunk packedSuffix empty)
        packedSpanText = pack spanText
        packedSuffix = pack suffix

-- | Create next span.
infixr 5 >|<
(>|<) :: (String, String) -> (Text, [Span]) -> (Text, [Span])
(>|<) :: (String, String) -> (Lazy.Text, [Span]) -> (Lazy.Text, [Span])
(spanLanguage, spanText) >|< (oldText, oldSpans) = (newText, newSpans)
    where
        newSpans = newSpan:oldSpans
        newSpan = Span (lengthWord8 packedSpanText) spanLanguage
        newText = append packedSpanText oldText
        newText = chunk packedSpanText oldText
        packedSpanText = pack spanText

-- | Add optional ignored prefix and wrap in a `Paragraph`.
infixr 5 |<
(|<) :: String -> (Text, [Span]) -> ParagraphOptions -> Paragraph
(|<) :: String -> (Lazy.Text, [Span]) -> ParagraphOptions -> Paragraph
prefix |< (oldText, spans) = Paragraph arr afterPrefix spans
    where
        (Text arr beforePrefix _) = append packedPrefix oldText
        (Text arr beforePrefix _) = toStrict $ chunk packedPrefix oldText
        afterPrefix = beforePrefix + lengthWord8 packedPrefix
        packedPrefix = pack prefix

-- | Create a `Paragraph` with no spans, just two ignored texts.
infixr 5 |<>|
(|<>|) :: String -> String -> ParagraphOptions -> Paragraph
prefix |<>| suffix = prefix |< (pack suffix, [])
prefix |<>| suffix = prefix |< (chunk (pack suffix) empty, [])

-- | Combine language with text.
infix 6 ~