@@ -18,7 +18,7 @@ import Data.Function.Uncurried (Fn2, Fn4, Fn7)
1818import Data.List.NonEmpty (NonEmptyList(..))
1919import Data.List.Types (List(..))
2020import Data.NonEmpty (NonEmpty(..))
21−import Data.Either (Either(..), isRight)
21+import Data.Either (Either(..), either, isRight)
2222import Data.Identity (Identity(..))
2323import Data.Nullable (Nullable, toNullable)
2424import Data.Time as Time
@@ -48,6 +48,8 @@ class IDBKey a where
4848instance eqKey :: Eq Key where
4949 eq a b = (runExceptT >>> runIdentity >>> isRight) $
5050 eq <$> ((fromKey a) :: F Int) <*> fromKey b
51+ <|>
52+ eq <$> ((fromKey a) :: F Number) <*> fromKey b
5153 <|>
5254 eq <$> ((fromKey a) :: F String) <*> fromKey b
5355 <|>
@@ -57,6 +59,35 @@ instance eqKey :: Eq Key where
5759 runIdentity (Identity x) = x
5860
5961
62+instance ordKey :: Ord Key where
63+ compare a b = (runExceptT >>> runIdentity >>> either (const LT) id) $
64+ compare <$> ((fromKey a) :: F Int) <*> fromKey b
65+ <|>
66+ compare <$> ((fromKey a) :: F Number) <*> fromKey b
67+ <|>
68+ compare <$> ((fromKey a) :: F String) <*> fromKey b
69+ <|>
70+ compare <$> ((fromKey a) :: F DateTime) <*> fromKey b
71+ where
72+ runIdentity :: forall a. Identity a -> a
73+ runIdentity (Identity x) = x
74+
75+
76+instance showKey :: Show Key where
77+ show a = (runExceptT >>> format) $
78+ (show <$> (fromKey a :: F Int))
79+ <|>
80+ (show <$> (fromKey a :: F Number))
81+ <|>
82+ (show <$> (fromKey a :: F String))
83+ <|>
84+ (show <$> (fromKey a :: F DateTime))
85+ where
86+ format :: forall a. Identity (Either a String) -> String
87+ format (Identity x) =
88+ either (const "(Key)") (\s -> "(Key " <> s <> ")") x
89+
90+
6091instance idbKeyInt :: IDBKey Int where
6192 toKey = Foreign.toForeign >>> Key
6293 fromKey (Key f) = Foreign.readInt f