on ae4a786 help sign in
rel8/src/Rel8/Column/Maybe.hs
124 lines 3.7 kB history raw
1{-# language DataKinds #-}
2{-# language FlexibleContexts #-}
3{-# language GADTs #-}
4{-# language LambdaCase #-}
5{-# language MultiParamTypeClasses #-}
6{-# language StandaloneKindSignatures #-}
7{-# language TypeFamilies #-}
8{-# language UndecidableInstances #-}
10module Rel8.Column.Maybe
11 ( HMaybe, AHMaybe(..)
12 )
13where
15-- base
16import Data.Kind ( Type )
17import Prelude
19-- rel8
20import Rel8.Aggregate ( Aggregate )
21import Rel8.Expr ( Expr )
22import Rel8.Kind.Context ( SContext(..), Reifiable( contextSing ) )
23import Rel8.Schema.Context ( Col )
24import Rel8.Schema.HTable.Maybe ( HMaybeTable )
25import qualified Rel8.Schema.Kind as K
26import Rel8.Schema.Name ( Name )
27import Rel8.Schema.Reify ( Reify, hreify, hunreify )
28import Rel8.Schema.Result ( Result )
29import Rel8.Table
30 ( Table, Columns, Context, fromColumns, toColumns
31 , Unreify, reify, unreify
32 )
33import Rel8.Table.Maybe ( MaybeTable )
34import Rel8.Table.Recontextualize ( Recontextualize )
37type HMaybe :: K.Context -> Type -> Type
38type family HMaybe context where
39 HMaybe (Reify context) = AHMaybe context
40 HMaybe Aggregate = MaybeTable
41 HMaybe Expr = MaybeTable
42 HMaybe Name = MaybeTable
43 HMaybe Result = Maybe
46type AHMaybe :: K.Context -> Type -> Type
47newtype AHMaybe context a = AHMaybe (HMaybe context a)
50instance Reifiable context => Functor (AHMaybe context) where
51 fmap = smapMaybe contextSing
54instance (Reifiable context, Table (Reify context) a) =>
55 Table (Reify context) (AHMaybe context a)
56 where
57 type Context (AHMaybe context a) = Reify context
58 type Columns (AHMaybe context a) = HMaybeTable (Columns a)
59 type Unreify (AHMaybe context a) = HMaybe context (Unreify a)
61 fromColumns = sfromColumnsMaybe contextSing
62 toColumns = stoColumnsMaybe contextSing
63 reify proof = fmap fmap reify proof . AHMaybe
64 unreify proof = (\(AHMaybe a) -> a) . fmap fmap unreify proof
67instance
68 ( Reifiable context, Reifiable context'
69 , Recontextualize (Reify context) (Reify context') a a'
70 ) =>
71 Recontextualize
72 (Reify context)
73 (Reify context')
74 (AHMaybe context a)
75 (AHMaybe context' a')
78smapMaybe :: ()
79 => SContext context
80 -> (a -> b)
81 -> AHMaybe context a
82 -> AHMaybe context b
83smapMaybe = \case
84 SAggregate -> \f (AHMaybe a) -> AHMaybe (fmap f a)
85 SExpr -> \f (AHMaybe a) -> AHMaybe (fmap f a)
86 SResult -> \f (AHMaybe a) -> AHMaybe (fmap f a)
87 SName -> \f (AHMaybe a) -> AHMaybe (fmap f a)
88 SReify context -> \f (AHMaybe a) -> AHMaybe (smapMaybe context f a)
91sfromColumnsMaybe :: Table (Reify context) a
92 => SContext context
93 -> HMaybeTable (Columns a) (Col (Reify context))
94 -> AHMaybe context a
95sfromColumnsMaybe = \case
96 SAggregate -> AHMaybe . fmap (fromColumns . hreify) . fromColumns . hunreify
97 SExpr -> AHMaybe . fmap (fromColumns . hreify) . fromColumns . hunreify
98 SResult -> AHMaybe . fmap (fromColumns . hreify) . fromColumns . hunreify
99 SName -> AHMaybe . fmap (fromColumns . hreify) . fromColumns . hunreify
100 SReify context ->
101 AHMaybe .
102 smapMaybe context (fromColumns . hreify) .
103 sfromColumnsMaybe context .
104 hunreify
107stoColumnsMaybe :: Table (Reify context) a
108 => SContext context
109 -> AHMaybe context a
110 -> HMaybeTable (Columns a) (Col (Reify context))
111stoColumnsMaybe = \case
112 SAggregate ->
113 hreify . toColumns . fmap (hunreify . toColumns) . (\(AHMaybe a) -> a)
114 SExpr ->
115 hreify . toColumns . fmap (hunreify . toColumns) . (\(AHMaybe a) -> a)
116 SResult ->
117 hreify . toColumns . fmap (hunreify . toColumns) . (\(AHMaybe a) -> a)
118 SName ->
119 hreify . toColumns . fmap (hunreify . toColumns) . (\(AHMaybe a) -> a)
120 SReify context ->
121 hreify .
122 stoColumnsMaybe context .
123 smapMaybe context (hunreify . toColumns) .
124 (\(AHMaybe a) -> a)