commit 5980a848fe0fecd59f92af930cc1702056fbf8c4
parent c15bc6c5431ec7c8edf018c294551f08d943a536
Author: Robert Russell <robert@rr3.xyz>
Date: Thu, 15 Oct 2026 21:22:20 -0700
Algebra.Magma: add Text instances
Diffstat:
1 file changed, 13 insertions(+), 0 deletions(-)
diff --git a/src/Lude/Algebra/Magma.hs b/src/Lude/Algebra/Magma.hs
@@ -176,6 +176,8 @@ module Lude.Algebra.Magma (
) where
import Data.Coerce
+import Data.Text (Text)
+import Data.Text qualified as Text
import Numeric.Natural (Natural)
import Numeric.Natural qualified as Base
import Prelude (Integer, Rational)
@@ -354,6 +356,7 @@ pstripL = pcancelL Combination
(\\!) = pstripL
infixr 5 \\!
+-- TODO: Argument order here is unintuitive. E.g., look at the Text instance.
type PartiallyStrippableR = PartiallyCancellableR Combination :: AlgebraClass
pstripR, (//!) :: PartialBinaryOp PartiallyStrippableR
pstripR = pcancelR Combination
@@ -724,6 +727,9 @@ instance (Base.Fractional a) => PartiallyCancellableR Multiplication (BaseIntero
instance (Base.Fractional a) => PartiallyHasInverses Multiplication (BaseInterop a) where pinvert _ = coerce Base.recip
instance (Base.Fractional a) => IsDivisionRing (BaseInterop a)
+instance (Base.Semigroup a) => IsSemigroupWith Combination (BaseInterop a) where operation _ = coerce (Base.<>)
+instance (Base.Monoid a) => IsMonoidWith Combination (BaseInterop a) where neutral _ = coerce Base.mempty
+
--------------------------------------------------------------------------------
baseDivNonZero :: forall (a :: Type). (Base.Eq a, Base.Fractional a) => a -> a -> Maybe a
@@ -796,3 +802,10 @@ instance (IsGroupWith op a) => IsGroupWith op (r -> a)
instance (HasCommutative op a) => HasCommutative op (r -> a)
instance (IsSemiring a) => IsSemiring (r -> a)
instance (IsRing a) => IsRing (r -> a)
+
+deriving via BaseInterop Text instance IsSemigroupWith Combination Text
+instance PartiallyCancellableL Combination Text where pcancelL _ p x = Text.stripPrefix p x ?? x
+instance PartiallyCancellableR Combination Text where pcancelR _ x s = Text.stripSuffix s x ?? x
+deriving via BaseInterop Text instance IsMonoidWith Combination Text
+instance DecidablyCancellableL Combination Text where tryCancelL# _ = coerce Text.stripPrefix
+instance DecidablyCancellableR Combination Text where tryCancelR# _ = coerce Text.stripSuffix