{-# LANGUAGE ViewPatterns #-} {- | Module: Text.NaturalComp.Collation Copyright: 2013 Hironao Komatsu License: BSD Maintainer: Hironao Komatsu 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