forked from haskell-to-elm/haskell-to-elm
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Parameterised.hs
62 lines (50 loc) · 2.08 KB
/
Parameterised.hs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
{-# language DeriveAnyClass #-}
{-# language DeriveGeneric #-}
{-# language FlexibleContexts #-}
{-# language MultiParamTypeClasses #-}
{-# language OverloadedStrings #-}
{-# language ScopedTypeVariables #-}
{-# language TypeApplications #-}
module Parameterised where
import qualified Data.Aeson as Aeson
import Data.Foldable
import qualified Data.HashMap.Lazy as HashMap
import qualified Generics.SOP as SOP
import GHC.Generics
import qualified Language.Elm.Expression as Expression
import qualified Language.Elm.Pretty as Pretty
import qualified Language.Elm.Simplification as Simplification
import qualified Language.Elm.Type as Type
import Language.Haskell.To.Elm
data Result e a
= Err e
| Ok a
deriving (Generic, Aeson.ToJSON, SOP.Generic, SOP.HasDatatypeInfo)
instance HasElmType Result where
elmDefinition =
Just $ deriveElmTypeDefinition @Result defaultOptions "Api.Result.Result"
instance HasElmDecoder Aeson.Value Result where
elmDecoderDefinition =
Just $ deriveElmJSONDecoder @Result defaultOptions Aeson.defaultOptions "Api.Result.decoder"
instance HasElmEncoder Aeson.Value Result where
elmEncoderDefinition =
Just $ deriveElmJSONEncoder @Result defaultOptions Aeson.defaultOptions "Api.Result.encoder"
instance (HasElmType a, HasElmType b) => HasElmType (Result a b) where
elmType =
Type.apps (elmType @Result) [elmType @a, elmType @b]
instance (HasElmDecoder Aeson.Value a, HasElmDecoder Aeson.Value b) => HasElmDecoder Aeson.Value (Result a b) where
elmDecoder =
Expression.apps (elmDecoder @Aeson.Value @Result) [elmDecoder @Aeson.Value @a, elmDecoder @Aeson.Value @b]
instance (HasElmEncoder Aeson.Value a, HasElmDecoder Aeson.Value b) => HasElmEncoder Aeson.Value (Result a b) where
elmEncoder =
Expression.apps (elmEncoder @Aeson.Value @Result) [elmEncoder @Aeson.Value @a, elmDecoder @Aeson.Value @b]
main :: IO ()
main = do
let
definitions =
Simplification.simplifyDefinition <$>
jsonDefinitions @Result
modules =
Pretty.modules definitions
forM_ (HashMap.toList modules) $ \(_moduleName, contents) ->
print contents