module Coda.Syntax.Prefix
  ( Prefix(..)
  , joinAndCompare
  ) where
import Coda.Algebra.Zero
import Coda.Syntax.FromText
import Data.Char (isSpace)
import Data.Data hiding (Prefix)
import Data.Semigroup
import Data.String
import Data.Text as Text
import GHC.Generics hiding (Prefix)
import Prelude
newtype Prefix = Prefix Text deriving (Eq,Show,Generic,Data)
joinAndCompare :: Prefix -> Prefix -> Either Prefix Ordering
joinAndCompare (Prefix xs) (Prefix ys) = case commonPrefixes xs ys of
    Just (c, l, r) -> cmp c l r
    Nothing        -> cmp "" xs ys
  where
    cmp _ "" "" = Right EQ
    cmp _ "" _  = Right LT
    cmp _ _  "" = Right GT
    cmp c _  _  = Left (Prefix c)
instance Semigroup Prefix where
  Prefix xs <> Prefix ys
    = Prefix $ case commonPrefixes xs ys of
      Just (zs, _, _) -> zs
      Nothing         -> ""
instance SemigroupWithZero Prefix where
  zero = Prefix ""
instance FromText Prefix where
  fromText = Prefix . Text.takeWhile isSpace
instance IsString Prefix where
  fromString = Prefix . pack . Prelude.takeWhile isSpace