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