module Rosetta where

import Data.List (find)

fromExtension :: String -> Maybe LanguageTag
fromExtension :: String -> Maybe LanguageTag
fromExtension String
ext = (LanguageTag -> Bool) -> [LanguageTag] -> Maybe LanguageTag
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
find (\LanguageTag
t -> LanguageTag -> String
languageExtension LanguageTag
t String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
ext) [LanguageTag]
languageTags

fromTool :: String -> Maybe ProjectTag
fromTool :: String -> Maybe ProjectTag
fromTool String
tool = (ProjectTag -> Bool) -> [ProjectTag] -> Maybe ProjectTag
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Maybe a
find (\ProjectTag
t -> ProjectTag -> String
projectTool ProjectTag
t String -> String -> Bool
forall a. Eq a => a -> a -> Bool
== String
tool) [ProjectTag]
projectTags

data LanguageTag = CS | FS | HS | JV | NX | RS | SC
  deriving (LanguageTag
LanguageTag -> LanguageTag -> Bounded LanguageTag
forall a. a -> a -> Bounded a
maxBound :: LanguageTag
$cmaxBound :: LanguageTag
minBound :: LanguageTag
$cminBound :: LanguageTag
Bounded, Int -> LanguageTag
LanguageTag -> Int
LanguageTag -> [LanguageTag]
LanguageTag -> LanguageTag
LanguageTag -> LanguageTag -> [LanguageTag]
LanguageTag -> LanguageTag -> LanguageTag -> [LanguageTag]
(LanguageTag -> LanguageTag)
-> (LanguageTag -> LanguageTag)
-> (Int -> LanguageTag)
-> (LanguageTag -> Int)
-> (LanguageTag -> [LanguageTag])
-> (LanguageTag -> LanguageTag -> [LanguageTag])
-> (LanguageTag -> LanguageTag -> [LanguageTag])
-> (LanguageTag -> LanguageTag -> LanguageTag -> [LanguageTag])
-> Enum LanguageTag
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: LanguageTag -> LanguageTag -> LanguageTag -> [LanguageTag]
$cenumFromThenTo :: LanguageTag -> LanguageTag -> LanguageTag -> [LanguageTag]
enumFromTo :: LanguageTag -> LanguageTag -> [LanguageTag]
$cenumFromTo :: LanguageTag -> LanguageTag -> [LanguageTag]
enumFromThen :: LanguageTag -> LanguageTag -> [LanguageTag]
$cenumFromThen :: LanguageTag -> LanguageTag -> [LanguageTag]
enumFrom :: LanguageTag -> [LanguageTag]
$cenumFrom :: LanguageTag -> [LanguageTag]
fromEnum :: LanguageTag -> Int
$cfromEnum :: LanguageTag -> Int
toEnum :: Int -> LanguageTag
$ctoEnum :: Int -> LanguageTag
pred :: LanguageTag -> LanguageTag
$cpred :: LanguageTag -> LanguageTag
succ :: LanguageTag -> LanguageTag
$csucc :: LanguageTag -> LanguageTag
Enum, LanguageTag -> LanguageTag -> Bool
(LanguageTag -> LanguageTag -> Bool)
-> (LanguageTag -> LanguageTag -> Bool) -> Eq LanguageTag
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: LanguageTag -> LanguageTag -> Bool
$c/= :: LanguageTag -> LanguageTag -> Bool
== :: LanguageTag -> LanguageTag -> Bool
$c== :: LanguageTag -> LanguageTag -> Bool
Eq, Eq LanguageTag
Eq LanguageTag
-> (LanguageTag -> LanguageTag -> Ordering)
-> (LanguageTag -> LanguageTag -> Bool)
-> (LanguageTag -> LanguageTag -> Bool)
-> (LanguageTag -> LanguageTag -> Bool)
-> (LanguageTag -> LanguageTag -> Bool)
-> (LanguageTag -> LanguageTag -> LanguageTag)
-> (LanguageTag -> LanguageTag -> LanguageTag)
-> Ord LanguageTag
LanguageTag -> LanguageTag -> Bool
LanguageTag -> LanguageTag -> Ordering
LanguageTag -> LanguageTag -> LanguageTag
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: LanguageTag -> LanguageTag -> LanguageTag
$cmin :: LanguageTag -> LanguageTag -> LanguageTag
max :: LanguageTag -> LanguageTag -> LanguageTag
$cmax :: LanguageTag -> LanguageTag -> LanguageTag
>= :: LanguageTag -> LanguageTag -> Bool
$c>= :: LanguageTag -> LanguageTag -> Bool
> :: LanguageTag -> LanguageTag -> Bool
$c> :: LanguageTag -> LanguageTag -> Bool
<= :: LanguageTag -> LanguageTag -> Bool
$c<= :: LanguageTag -> LanguageTag -> Bool
< :: LanguageTag -> LanguageTag -> Bool
$c< :: LanguageTag -> LanguageTag -> Bool
compare :: LanguageTag -> LanguageTag -> Ordering
$ccompare :: LanguageTag -> LanguageTag -> Ordering
$cp1Ord :: Eq LanguageTag
Ord)

languageExtension :: LanguageTag -> String
languageExtension :: LanguageTag -> String
languageExtension LanguageTag
CS = String
"cs"
languageExtension LanguageTag
FS = String
"fs"
languageExtension LanguageTag
HS = String
"hs"
languageExtension LanguageTag
JV = String
"java"
languageExtension LanguageTag
NX = String
"nix"
languageExtension LanguageTag
RS = String
"rs"
languageExtension LanguageTag
SC = String
"scala"

languageTags :: [LanguageTag]
languageTags :: [LanguageTag]
languageTags = [LanguageTag
forall a. Bounded a => a
minBound ..]

languageLabel :: LanguageTag -> String
languageLabel :: LanguageTag -> String
languageLabel LanguageTag
CS = String
"csharp"
languageLabel LanguageTag
FS = String
"fsharp"
languageLabel LanguageTag
HS = String
"haskell"
languageLabel LanguageTag
JV = String
"java"
languageLabel LanguageTag
NX = String
"nix"
languageLabel LanguageTag
RS = String
"rust"
languageLabel LanguageTag
SC = String
"scala"

data ProjectTag = CABAL | CARGO | DOTNET | NIX | SBT | STACK
  deriving (ProjectTag
ProjectTag -> ProjectTag -> Bounded ProjectTag
forall a. a -> a -> Bounded a
maxBound :: ProjectTag
$cmaxBound :: ProjectTag
minBound :: ProjectTag
$cminBound :: ProjectTag
Bounded, Int -> ProjectTag
ProjectTag -> Int
ProjectTag -> [ProjectTag]
ProjectTag -> ProjectTag
ProjectTag -> ProjectTag -> [ProjectTag]
ProjectTag -> ProjectTag -> ProjectTag -> [ProjectTag]
(ProjectTag -> ProjectTag)
-> (ProjectTag -> ProjectTag)
-> (Int -> ProjectTag)
-> (ProjectTag -> Int)
-> (ProjectTag -> [ProjectTag])
-> (ProjectTag -> ProjectTag -> [ProjectTag])
-> (ProjectTag -> ProjectTag -> [ProjectTag])
-> (ProjectTag -> ProjectTag -> ProjectTag -> [ProjectTag])
-> Enum ProjectTag
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: ProjectTag -> ProjectTag -> ProjectTag -> [ProjectTag]
$cenumFromThenTo :: ProjectTag -> ProjectTag -> ProjectTag -> [ProjectTag]
enumFromTo :: ProjectTag -> ProjectTag -> [ProjectTag]
$cenumFromTo :: ProjectTag -> ProjectTag -> [ProjectTag]
enumFromThen :: ProjectTag -> ProjectTag -> [ProjectTag]
$cenumFromThen :: ProjectTag -> ProjectTag -> [ProjectTag]
enumFrom :: ProjectTag -> [ProjectTag]
$cenumFrom :: ProjectTag -> [ProjectTag]
fromEnum :: ProjectTag -> Int
$cfromEnum :: ProjectTag -> Int
toEnum :: Int -> ProjectTag
$ctoEnum :: Int -> ProjectTag
pred :: ProjectTag -> ProjectTag
$cpred :: ProjectTag -> ProjectTag
succ :: ProjectTag -> ProjectTag
$csucc :: ProjectTag -> ProjectTag
Enum, ProjectTag -> ProjectTag -> Bool
(ProjectTag -> ProjectTag -> Bool)
-> (ProjectTag -> ProjectTag -> Bool) -> Eq ProjectTag
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: ProjectTag -> ProjectTag -> Bool
$c/= :: ProjectTag -> ProjectTag -> Bool
== :: ProjectTag -> ProjectTag -> Bool
$c== :: ProjectTag -> ProjectTag -> Bool
Eq, Eq ProjectTag
Eq ProjectTag
-> (ProjectTag -> ProjectTag -> Ordering)
-> (ProjectTag -> ProjectTag -> Bool)
-> (ProjectTag -> ProjectTag -> Bool)
-> (ProjectTag -> ProjectTag -> Bool)
-> (ProjectTag -> ProjectTag -> Bool)
-> (ProjectTag -> ProjectTag -> ProjectTag)
-> (ProjectTag -> ProjectTag -> ProjectTag)
-> Ord ProjectTag
ProjectTag -> ProjectTag -> Bool
ProjectTag -> ProjectTag -> Ordering
ProjectTag -> ProjectTag -> ProjectTag
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: ProjectTag -> ProjectTag -> ProjectTag
$cmin :: ProjectTag -> ProjectTag -> ProjectTag
max :: ProjectTag -> ProjectTag -> ProjectTag
$cmax :: ProjectTag -> ProjectTag -> ProjectTag
>= :: ProjectTag -> ProjectTag -> Bool
$c>= :: ProjectTag -> ProjectTag -> Bool
> :: ProjectTag -> ProjectTag -> Bool
$c> :: ProjectTag -> ProjectTag -> Bool
<= :: ProjectTag -> ProjectTag -> Bool
$c<= :: ProjectTag -> ProjectTag -> Bool
< :: ProjectTag -> ProjectTag -> Bool
$c< :: ProjectTag -> ProjectTag -> Bool
compare :: ProjectTag -> ProjectTag -> Ordering
$ccompare :: ProjectTag -> ProjectTag -> Ordering
$cp1Ord :: Eq ProjectTag
Ord)

projectTags :: [ProjectTag]
projectTags :: [ProjectTag]
projectTags = [ProjectTag
forall a. Bounded a => a
minBound ..]

projectLanguages :: ProjectTag -> [LanguageTag]
projectLanguages :: ProjectTag -> [LanguageTag]
projectLanguages ProjectTag
CABAL = [LanguageTag
HS]
projectLanguages ProjectTag
CARGO = [LanguageTag
RS]
projectLanguages ProjectTag
DOTNET = [LanguageTag
CS, LanguageTag
FS]
projectLanguages ProjectTag
NIX = [LanguageTag
NX]
projectLanguages ProjectTag
SBT = [LanguageTag
JV, LanguageTag
SC]
projectLanguages ProjectTag
STACK = [LanguageTag
HS]

projectTool :: ProjectTag -> String
projectTool :: ProjectTag -> String
projectTool ProjectTag
CABAL = String
"cabal"
projectTool ProjectTag
CARGO = String
"cargo"
projectTool ProjectTag
DOTNET = String
"dotnet"
projectTool ProjectTag
NIX = String
"nix-shell"
projectTool ProjectTag
SBT = String
"sbt"
projectTool ProjectTag
STACK = String
"stack"

projectToolBuildArgs :: ProjectTag -> [String]
projectToolBuildArgs :: ProjectTag -> [String]
projectToolBuildArgs ProjectTag
NIX = [String
"."]
projectToolBuildArgs ProjectTag
SBT = [String
"compile"]
projectToolBuildArgs ProjectTag
_ = [String
"build"]