@@ -1,20 +1,26 @@
11{-# language DataKinds #-}
22{-# language GADTs #-}
3+{-# language NamedFieldPuns #-}
34{-# language StandaloneKindSignatures #-}
45{-# language TypeFamilies #-}
56
67module Rel8.Schema.Result
78 ( Col( Result ), Result
9+ , relabel
10+ , null, nullifier, unnullifier
11+ , vectorizer, unvectorizer
812 )
913where
1014
1115-- base
12−import Prelude ()
16+import Prelude hiding ( null )
1317
1418-- rel8
1519import Rel8.Schema.Context ( Interpretation( Col ) )
20+import Rel8.Schema.HTable.Identity ( HIdentity(..) )
1621import Rel8.Schema.Kind ( Context )
17−import Rel8.Schema.Spec ( Spec( Spec ) )
22+import Rel8.Schema.Null ( Nullify, Nullity( Null, NotNull ) )
23+import Rel8.Schema.Spec ( Spec( Spec ), SSpec(..) )
1824
1925
2026type Result :: Context
@@ -24,3 +30,46 @@ data Result a
2430instance Interpretation Result where
2531 data Col Result _spec where
2632 Result :: a -> Col Result ('Spec labels necessity a)
33+
34+
35+relabel :: ()
36+ => HIdentity ('Spec labels necessity a) (Col Result)
37+ -> HIdentity ('Spec relabels necessity a) (Col Result)
38+relabel (HIdentity (Result a)) = HIdentity (Result a)
39+
40+
41+null :: Col Result ('Spec labels necessity (Maybe a))
42+null = Result Nothing
43+
44+
45+nullifier :: ()
46+ => SSpec ('Spec labels necessity a)
47+ -> Col Result ('Spec labels necessity a)
48+ -> Col Result ('Spec labels necessity (Nullify a))
49+nullifier SSpec {nullity} (Result a) = Result $ case nullity of
50+ Null -> a
51+ NotNull -> Just a
52+
53+
54+unnullifier :: ()
55+ => SSpec ('Spec labels necessity a)
56+ -> Col Result ('Spec labels necessity (Nullify a))
57+ -> Maybe (Col Result ('Spec labels necessity a))
58+unnullifier SSpec {nullity} (Result a) =
59+ case nullity of
60+ Null -> pure $ Result a
61+ NotNull -> Result <$> a
62+
63+
64+vectorizer :: Functor f
65+ => SSpec ('Spec labels necessity a)
66+ -> f (Col Result ('Spec labels necessity a))
67+ -> Col Result ('Spec labels necessity (f a))
68+vectorizer _ = Result . fmap (\(Result a) -> a)
69+
70+
71+unvectorizer :: Functor f
72+ => SSpec ('Spec labels necessity a)
73+ -> Col Result ('Spec labels necessity (f a))
74+ -> f (Col Result ('Spec labels necessity a))
75+unvectorizer _ (Result results) = Result <$> results