-- generated file, do not modify! -- {{ dateTime }} module {{ moduleName }} where import Prelude import Data.Generic import Data.Either (Either(..)) import Data.Maybe (Maybe(..)) import Data.StrMap (StrMap(..)) import Data.Map (Map(..)) import Data.List (List(..)) import LambdaCube.LinearBase import Data.Argonaut.Encode.Combinators ((~>), (:=)) import Data.Argonaut.Decode.Combinators ((.?)) import Data.Argonaut.Core (jsonEmptyObject) import Data.Argonaut.Printer (printJson) import Data.Argonaut.Encode (class EncodeJson, encodeJson) import Data.Argonaut.Decode (class DecodeJson, decodeJson) {% for m in imports %} import {{ m.value }} {% endfor %} {% for t in dataAndType %} {% case t.value | constType %} {% when "DataDef" %} data {{ t.value.dataName }}{% for c in t.value.constructors %} {% if c.value.fields | hasFieldNames %} {% if c.first %}={% else %}|{% endif %} {{ c.value.name }} {% for f in c.value.fields %}{% if f.first %} { {%else%} , {%endif%}{{ f.value.fieldName }} :: {{ f.value.fieldType | psType }} {% endfor %} } {% else %} {% if c.first %}={% else %}|{% endif %} {{ c.value.name }}{% for f in c.value.fields %} {{ f.value.fieldType | psType | parens }}{% endfor %}{% endif %}{% endfor %} {% when "TypeAlias" %} type {{ t.value.aliasName }} = {{ t.value.aliasType | psType }} {% endcase %} {% endfor %} {% for t in definitions %} {% let l = t.value.instances | psInstances %} {% for i in l %} {% if i.first %} derive instance generic{{ t.value.dataName }} :: Generic {{ t.value.dataName }} {% endif %} {% case i.value %} {% when "Show" %} instance show{{ t.value.dataName }} :: Show {{ t.value.dataName }} where show = gShow {% when "Eq" %} instance eq{{ t.value.dataName }} :: Eq {{ t.value.dataName }} where eq = gEq {% else %} -- FIXME: {{ i.value }} instance is not supported! {% endcase %} {% endfor %} {% endlet %} {% endfor %} {# JSON Encode and Decode #} {% for t in definitions %} instance encodeJson{{ t.value.dataName }} :: EncodeJson {{ t.value.dataName }} where encodeJson v = case v of{% for c in t.value.constructors %}{% if c.value.fields | hasFieldNames %} {{ c.value.name }} r -> "tag" := "{{ c.value.name }}" ~>{% for f in c.value.fields %} "{{ f.value.fieldName }}" := r.{{ f.value.fieldName }} ~>{% endfor %} jsonEmptyObject{% else %} {{ c.value.name }}{% for f in c.value.fields %} arg{{ f.index0 }}{% endfor %} -> "tag" := "{{ c.value.name }}"{% for f in c.value.fields %} ~> "arg{{ f.index0 }}" := arg{{ f.index0 }}{% endfor %} ~> jsonEmptyObject{% endif %}{% endfor %} instance decodeJson{{ t.value.dataName }} :: DecodeJson {{ t.value.dataName }} where decodeJson json = do obj <- decodeJson json tag <- obj .? "tag" case tag of{% for c in t.value.constructors %}{% if c.value.fields | hasFieldNames %} "{{ c.value.name }}" -> do{% for f in c.value.fields %} {{ f.value.fieldName }} <- obj .? "{{ f.value.fieldName }}"{% endfor %} pure $ {{ c.value.name }}{% for f in c.value.fields %} {% if f.first %}{ {% else %}, {%endif%}{{ f.value.fieldName }}:{{ f.value.fieldName }}{% endfor %} } {% else %} "{{ c.value.name }}" -> {% for f in c.value.fields %}{% if f.first %}{{ c.value.name }} <$>{% else %} <*>{% endif %} obj .? "arg{{ f.index0 }}"{%else%}pure {{ c.value.name }}{% endfor %}{% endif %}{% endfor %} _ -> Left ("decodeJson{{ t.value.dataName }} - unknown tag: " <> tag) {% endfor %}