diff options
author | Daniel Gröber <dxld@darkboxed.org> | 2019-07-30 16:08:18 +0200 |
---|---|---|
committer | Daniel Gröber (dxld) <dxld@darkboxed.org> | 2019-09-17 17:48:26 +0200 |
commit | f29e10402d7cba68264f06d8644712e189e17142 (patch) | |
tree | 667c494131cf5fa1dd04fa664cb8a2b6d6d767ee /src/CabalHelper | |
parent | 8c9361e4ba6e2257f2bd9d354a56005318477ed6 (diff) |
Split SProjType along build-tool line
This makes it much easier to deal with differences between the build tools
as we can now have functions that only make sense for Cabal and statically
enforce this by passing a 'SCabalProjType pt' as evidence that $pt \in {V1,
V2}$.
Diffstat (limited to 'src/CabalHelper')
-rw-r--r-- | src/CabalHelper/Compiletime/Types.hs | 59 |
1 files changed, 37 insertions, 22 deletions
diff --git a/src/CabalHelper/Compiletime/Types.hs b/src/CabalHelper/Compiletime/Types.hs index f9900bb..edbcd46 100644 --- a/src/CabalHelper/Compiletime/Types.hs +++ b/src/CabalHelper/Compiletime/Types.hs @@ -50,13 +50,23 @@ data ProjType deriving (Eq, Ord, Show, Read) data SProjType pt where - SV1 :: SProjType 'V1 - SV2 :: SProjType 'V2 + SCabal :: !(SCabalProjType pt) -> SProjType pt SStack :: SProjType 'Stack +deriving instance Show (SProjType pt) + +-- | This is a singleton, like 'SProjType', but restricted to just the +-- Cabal project types. We use this to restrict some functions which don't +-- make sense for Stack to just the Cabal project types. +data SCabalProjType pt where + SCV1 :: SCabalProjType 'V1 + SCV2 :: SCabalProjType 'V2 + +deriving instance Show (SCabalProjType pt) + demoteSProjType :: SProjType pt -> ProjType -demoteSProjType SV1 = V1 -demoteSProjType SV2 = V2 +demoteSProjType (SCabal SCV1) = V1 +demoteSProjType (SCabal SCV2) = V2 demoteSProjType SStack = Stack -- | Location of project sources. The project type of a given directory can be @@ -89,29 +99,34 @@ plV1Dir :: ProjLoc 'V1 -> FilePath plV1Dir ProjLocV1CabalFile {plPackageDir} = plPackageDir plV1Dir ProjLocV1Dir {plPackageDir} = plPackageDir +projTypeOfProjLoc :: ProjLoc pt -> SProjType pt +projTypeOfProjLoc ProjLocV1CabalFile{} = SCabal SCV1 +projTypeOfProjLoc ProjLocV1Dir{} = SCabal SCV1 +projTypeOfProjLoc ProjLocV2File{} = SCabal SCV2 +projTypeOfProjLoc ProjLocV2Dir{} = SCabal SCV2 +projTypeOfProjLoc ProjLocStackYaml{} = SStack + +-- | A build directory for a certain project type. The @pt@ type variable +-- must match the value of 'ProjLoc'. This is enforced by the type system +-- so you can't get this wrong :) data DistDir (pt :: ProjType) where - -- | Build directory for cabal /old-build/ aka. /v1-build/ aka. just - -- /build/. Planned to be superceeded by /v2-build/, see 'DistDirV2' for - -- that. - -- - -- You can tell a builddir is a /v1/ builddir by looking for a file - -- called @setup-config@ directly underneath it. - DistDirV1 :: !FilePath -> DistDir 'V1 - - -- | Build directory for cabal /new-build/ aka. /v2-build/, as of the time - -- of this writing it is usually called @dist-newstyle/@ but this will - -- presumably change once it becomes the default /build/ command. - -- - -- You can tell a builddir is a /v2/ builddir by trying to access the path - -- @cache/plan.json@ directly underneath it. - DistDirV2 :: !FilePath -> DistDir 'V2 - - -- | Build directory for stack, aka. /work-dir/. Optionally override Stack's - -- /work-dir/. If you just want to use Stack's default set to @Nothing@ + -- | A build-directory for cabal, aka. dist-dir in Cabal + -- terminology. 'SCabalProjType' specifies whether we should use + -- /v2-build/ or /v1-build/. This choice must correspond to + -- 'ProjLoc'\'s project type. + DistDirCabal :: !(SCabalProjType pt) -> !FilePath -> DistDir pt + + -- | A build-directory for stack, aka. /work-dir/. Optionally override + -- Stack's /work-dir/. If you just want to use Stack's default set to + -- @Nothing@ DistDirStack :: !(Maybe RelativePath) -> DistDir 'Stack deriving instance Show (DistDir pt) +projTypeOfDistDir :: DistDir pt -> SProjType pt +projTypeOfDistDir (DistDirCabal pt _) = SCabal pt +projTypeOfDistDir DistDirStack{} = SStack + -- | General purpose existential wrapper. Useful for hiding a phantom type -- argument. -- |