1{-# language DataKinds #-}
2{-# language FlexibleContexts #-}
4{-# language LambdaCase #-}
5{-# language MultiParamTypeClasses #-}
6{-# language ScopedTypeVariables #-}
7{-# language StandaloneKindSignatures #-}
8{-# language TypeApplications #-}
9{-# language TypeFamilyDependencies #-}
10{-# language UndecidableInstances #-}
12module Rel8.Column.Maybe
18import Control.Category ( id )
19import Data.Kind ( Type )
20import Data.Type.Equality ( (:~:)( Refl ), apply )
21import Prelude hiding ( id )
24import Rel8.Aggregate ( Aggregate )
25import Rel8.Expr ( Expr )
26import Rel8.Kind.Context ( SContext(..), Reifiable( contextSing ) )
27import Rel8.Schema.Context ( Col )
28import Rel8.Schema.HTable.Maybe ( HMaybeTable )
29import qualified Rel8.Schema.Kind as K
30import Rel8.Schema.Name ( Name )
31import Rel8.Schema.Reify ( Reify, hreify, hunreify )
32import Rel8.Schema.Result ( Result, absurd )
34 ( Table, Columns, Context, fromColumns, toColumns
35 , Unreify, reify, unreify, coherence, congruence
37import Rel8.Table.Maybe ( MaybeTable )
38import Rel8.Table.Recontextualize ( Recontextualize )
41-- | Nest a 'Maybe' value within a 'Rel8able'. @HMaybe f a@ will produce a
42-- 'MaybeTable' @a@ in the 'Expr' context, and a 'Maybe' @a@ in the 'Result'
44type HMaybe :: K.Context -> Type -> Type
45type family HMaybe context = maybe | maybe -> context where
46 HMaybe (Reify context) = AHMaybe context
47 HMaybe Aggregate = MaybeTable Aggregate
48 HMaybe Expr = MaybeTable Expr
49 HMaybe Name = MaybeTable Name
53type AHMaybe :: K.Context -> Type -> Type
54newtype AHMaybe context a = AHMaybe (HMaybe context a)
57instance Reifiable context => Functor (AHMaybe context) where
58 fmap = smapMaybe contextSing
61instance (Reifiable context, Table (Reify context) a) =>
62 Table (Reify context) (AHMaybe context a)
64 type Context (AHMaybe context a) = Reify context
65 type Columns (AHMaybe context a) = HMaybeTable (Columns a)
66 type Unreify (AHMaybe context a) = HMaybe context (Unreify a)
68 fromColumns = sfromColumnsMaybe contextSing
69 toColumns = stoColumnsMaybe contextSing
70 reify proof = fmap fmap reify proof . AHMaybe
71 unreify proof = (\(AHMaybe a) -> a) . fmap fmap unreify proof
73 coherence = case contextSing @context of
74 SAggregate -> coherence @(Reify context) @a
75 SExpr -> coherence @(Reify context) @a
76 SName -> coherence @(Reify context) @a
77 SResult -> \Refl -> absurd
78 SReify _ -> \Refl _ -> Refl
80 congruence proof@Refl abstract = case contextSing @context of
81 SAggregate -> id `apply` congruence @(Reify context) @a proof abstract
82 SExpr -> id `apply` congruence @(Reify context) @a proof abstract
83 SName -> id `apply` congruence @(Reify context) @a proof abstract
84 SResult -> absurd abstract
85 SReify _ -> id `apply` congruence @(Reify context) @a proof abstract
89 ( Reifiable context, Reifiable context'
90 , Recontextualize (Reify context) (Reify context') a a'
105 SAggregate -> \f (AHMaybe a) -> AHMaybe (fmap f a)
106 SExpr -> \f (AHMaybe a) -> AHMaybe (fmap f a)
107 SResult -> \f (AHMaybe a) -> AHMaybe (fmap f a)
108 SName -> \f (AHMaybe a) -> AHMaybe (fmap f a)
109 SReify context -> \f (AHMaybe a) -> AHMaybe (smapMaybe context f a)
112sfromColumnsMaybe :: Table (Reify context) a
114 -> HMaybeTable (Columns a) (Col (Reify context))
116sfromColumnsMaybe = \case
117 SAggregate -> AHMaybe . fmap (fromColumns . hreify) . fromColumns . hunreify
118 SExpr -> AHMaybe . fmap (fromColumns . hreify) . fromColumns . hunreify
119 SResult -> AHMaybe . fmap (fromColumns . hreify) . fromColumns . hunreify
120 SName -> AHMaybe . fmap (fromColumns . hreify) . fromColumns . hunreify
123 smapMaybe context (fromColumns . hreify) .
124 sfromColumnsMaybe context .
128stoColumnsMaybe :: Table (Reify context) a
131 -> HMaybeTable (Columns a) (Col (Reify context))
132stoColumnsMaybe = \case
134 hreify . toColumns . fmap (hunreify . toColumns) . (\(AHMaybe a) -> a)
136 hreify . toColumns . fmap (hunreify . toColumns) . (\(AHMaybe a) -> a)
138 hreify . toColumns . fmap (hunreify . toColumns) . (\(AHMaybe a) -> a)
140 hreify . toColumns . fmap (hunreify . toColumns) . (\(AHMaybe a) -> a)
143 stoColumnsMaybe context .
144 smapMaybe context (hunreify . toColumns) .
keysesc to close
- j k
- move down, up
- enter
- open
- esc
- back, or up a level
- 1 2 3 4
- readme, files, commits, refs
- /
- filter
- y
- copy the clone command
- c
- compare the chosen commit with another (or shift-click both)
- ?
- show or hide this list