1 {-# LANGUAGE UndecidableInstances #-}
2 {-# OPTIONS_GHC -fno-warn-orphans #-}
3 -- | Symantic for the file system.
4 module Hcompta.LCC.Sym.FileSystem where
6 import Control.Applicative (Applicative(..))
8 import Data.Foldable (concat)
9 import Data.Function (($), (.))
10 import Data.Functor (Functor(..), (<$>))
11 import Data.Maybe (Maybe(..))
12 import Data.Type.Equality ((:~:)(Refl))
13 import System.IO (FilePath)
14 import Text.Show (Show(..))
15 import qualified Data.Text as Text
16 import qualified Prelude ()
18 import Language.Symantic.Grammar
19 import Language.Symantic
21 import Hcompta.LCC.Journal (PathFile(..))
23 -- * Class 'Sym_PathFile'
24 type instance Sym PathFile = Sym_PathFile
25 class Sym_PathFile term where
26 pathfile :: PathFile -> term PathFile
27 default pathfile :: Sym_PathFile (UnT term) => Trans term => PathFile -> term PathFile
28 pathfile = trans . pathfile
30 instance Sym_PathFile Eval where
32 instance Sym_PathFile View where
33 pathfile a = View $ \_p _v -> Text.pack (show a)
34 instance (Sym_PathFile r1, Sym_PathFile r2) => Sym_PathFile (Dup r1 r2) where
35 pathfile x = pathfile x `Dup` pathfile x
36 instance (Sym_PathFile term, Sym_Lambda term) => Sym_PathFile (BetaT term)
38 instance ClassInstancesFor PathFile where
39 proveConstraintFor _ (TyApp _ (TyConst _ _ q) c)
40 | Just HRefl <- proj_ConstKiTy @(K PathFile) @PathFile c
42 _ | Just Refl <- proj_Const @Eq q -> Just Dict
43 | Just Refl <- proj_Const @Show q -> Just Dict
45 proveConstraintFor _c _q = Nothing
46 instance TypeInstancesFor PathFile
48 instance -- Gram_Term_AtomsFor
54 ) => Gram_Term_AtomsFor src ss g PathFile where
58 (\a src -> BinTree0 $ Token_Term $ TermAVT $ (`setSource` src) $ tePathFile a)
62 g_pathfile :: CF g PathFile
67 <*> (concat <$> some ((:) <$> char '/' <*> g_pathfile_section))
68 g_pathfile_section :: CF g FilePath
69 g_pathfile_section = some (choice $ unicat <$> [Unicat_Letter, Unicat_Number])
70 instance (Source src, SymInj ss PathFile) => ModuleFor src ss PathFile where
71 moduleFor = ["PathFile"] `moduleWhere`
75 tyPathFile :: Source src => LenInj vs => Type src vs PathFile
76 tyPathFile = tyConst @(K PathFile) @PathFile
78 tePathFile :: Source src => SymInj ss PathFile => PathFile -> Term src ss ts '[] (() #> PathFile)
79 tePathFile a = Term noConstraint tyPathFile $ teSym @PathFile $ pathfile a