packages feed

naturalcomp-0.0.3: Text/NaturalComp/Collation.hs

{-# LANGUAGE ViewPatterns #-}

{- |
   Module:      Text.NaturalComp.Collation
   Copyright:   2013 Hironao Komatsu
   License:     BSD
   Maintainer:  Hironao Komatsu <hirkmt@gmail.com>
   Portability: portable

   Natural order and Unicode-aware string comparison using rfc5051 module.
-}

module Text.NaturalComp.Collation ( naturalCollate
                                  , unicodeCollate ) where

import Data.Function (on)
import Data.RFC5051
import Text.NaturalComp (naturalCompBy)
import Text.NaturalComp.Stringy (Stringy, uncons)

-- | Natural order and Unicode-aware string collation
naturalCollate :: Stringy s => s -> s -> Ordering
naturalCollate = naturalCompBy (compareUnicode `on` return)

-- | Normal (not natural) Unicode collation that can be used for
--   Text and ByteString
unicodeCollate :: Stringy s => s -> s -> Ordering
unicodeCollate = unicodeCollateFull (compareUnicode `on` return) EQ
    where
      unicodeCollateFull :: Stringy s => (Char -> Char -> Ordering)
                         -> Ordering -> s -> s -> Ordering
      unicodeCollateFull _ o  (uncons -> Nothing) (uncons -> Nothing) = o
      unicodeCollateFull _ EQ (uncons -> Nothing) _                   = LT
      unicodeCollateFull _ EQ _                   (uncons -> Nothing) = GT
      unicodeCollateFull f EQ (uncons -> Just (x, xs))
                              (uncons -> Just (y, ys)) =
                                  unicodeCollateFull f (f x y) xs ys
      unicodeCollateFull _ o  _ _ = o