This commit is contained in:
Gregor Kleen 2019-04-24 15:13:06 +02:00
parent 8e5bebc96f
commit 816ce0595e
2 changed files with 29 additions and 23 deletions

View File

@ -320,19 +320,16 @@ deriveJSON defaultOptions
} ''SubmissionMode
derivePersistFieldJSON ''SubmissionMode
instance PathPiece SubmissionMode where
toPathPiece = (Map.fromList (zip universeF verbs) !)
where
verbs = [ "no-submissions"
, "no-upload"
, "no-unpack"
, "unpack"
, "correctors"
, "correctors+no-upload"
, "correctors+no-unpack"
, "correctors+unpack"
]
fromPathPiece = finiteFromPathPiece
finitePathPiece ''SubmissionMode
[ "no-submissions"
, "no-upload"
, "no-unpack"
, "unpack"
, "correctors"
, "correctors+no-upload"
, "correctors+no-unpack"
, "correctors+unpack"
]
data SubmissionModeDescr = SubmissionModeNone
| SubmissionModeCorrector
@ -342,15 +339,12 @@ data SubmissionModeDescr = SubmissionModeNone
instance Universe SubmissionModeDescr
instance Finite SubmissionModeDescr
instance PathPiece SubmissionModeDescr where
toPathPiece = (Map.fromList (zip universeF verbs) !)
where
verbs = [ "no-submissions"
, "correctors"
, "users"
, "correctors+users"
]
fromPathPiece = finiteFromPathPiece
finitePathPiece ''SubmissionModeDescr
[ "no-submissions"
, "correctors"
, "users"
, "correctors+users"
]
classifySubmissionMode :: SubmissionMode -> SubmissionModeDescr
classifySubmissionMode (SubmissionMode False Nothing ) = SubmissionModeNone

View File

@ -1,7 +1,7 @@
module Utils.PathPiece
( finiteFromPathPiece
, nullaryToPathPiece
, nullaryPathPiece
, nullaryPathPiece, finitePathPiece
, splitCamel
, camelToPathPiece, camelToPathPiece'
, tuplePathPiece
@ -16,6 +16,8 @@ import Data.Universe
import qualified Data.Text as Text
import qualified Data.Char as Char
import qualified Data.Map as Map
import Numeric.Natural
import Data.List (foldl)
@ -44,6 +46,16 @@ nullaryPathPiece nullaryType mangle =
, funD 'fromPathPiece
[ clause [] (normalB [e|finiteFromPathPiece|]) [] ]
]
finitePathPiece :: Name -> [Text] -> DecsQ
finitePathPiece finiteType verbs =
pure <$> instanceD (cxt []) [t|PathPiece $(conT finiteType)|]
[ funD 'toPathPiece
[ clause [] (normalB [|(Map.fromList (zip universeF verbs) !)|]) [] ]
, funD 'fromPathPiece
[ clause [] (normalB [e|(Map.fromList (zip verbs universeF) !?)|]) [] ]
]
splitCamel :: Textual t => t -> [t]
splitCamel = map fromList . reverse . helper (error "hasChange undefined at start of string") [] "" . otoList