~jaro/balkon

904bd77ec7a8460971bec4a592629ee74c8aec3f — Jaro 1 year, 9 months ago d750f23
Add trivial instances of text containers.
1 files changed, 12 insertions(+), 1 deletions(-)

M src/Data/Text/ParagraphLayout/Internal/TextContainer.hs
M src/Data/Text/ParagraphLayout/Internal/TextContainer.hs => src/Data/Text/ParagraphLayout/Internal/TextContainer.hs +12 -1
@@ 11,13 11,17 @@ where
import Data.List.NonEmpty (NonEmpty((:|)))
import Data.Text (Text)
import qualified Data.Text as Text
import Data.Text.Foreign (lengthWord8)
import Data.Text.Foreign (dropWord8, lengthWord8, takeWord8)

-- | Class of data types containing `Text` that can be accessed.
class TextContainer a where
    -- | Extract a `Text` from its container.
    getText :: a -> Text

-- | As a trivial instance, each `Text` contains itself.
instance TextContainer Text where
    getText = id

-- | Class of data types containing `Text` that can be split at a given number
-- of `Data.Word.Word8` units from the start of the text.
class TextContainer a => SeparableTextContainer a where


@@ 26,6 30,13 @@ class TextContainer a => SeparableTextContainer a where
    -- constraints the instance requires.
    splitTextAt8 :: Int -> a -> (a, a)

-- | As a trivial instance, each `Text` can be split directly.
instance SeparableTextContainer Text where
    splitTextAt8 n t = (t1, t2)
        where
            t1 = takeWord8 (fromIntegral n) t
            t2 = dropWord8 (fromIntegral n) t

-- | Treat a list of text containers as a contiguous sequence,
-- and make a split at the given number of `Data.Word.Word8` from the beginning
-- of this sequence.