block start auto
  string val
    name value definition
    desc Create a value-level declaration
    snip
      $1 :: $2
      $1 $3 = $4

  for kind <- @⟨type,newtype,data⟩
  string @kind
    name @kind definition
    desc Define a @⟨@kind:type,newtype,adt⟩
    snip @kind $1 = $2

  string example
    name example docstring
    desc Provide example usage for some piece of code
    snip
      -- | Example:
      -- | ```purs
      -- | $0
      -- | ```

  string class
    name typeclass declaration
    desc Declare a typeclass
    snip
      class $1 $|2⟨
        where
          $2,
        $2
      ⟩

  string instance
    name typeclass instance
    desc Declare a typeclass instance
    snip
      instance $1 $|2⟨
        where
          $2,
        $2
      ⟩

  string derive
    name derive typeclass instance
    desc Derive a typeclass instance
    snip derive instance $|1⟨$1,newtype $1⟩instance $0

  for typeclass <- @⟨Eq,Ord,Functor⟩
  string d@⟨@typeclass:eq,ord,functor⟩
    name derive @typeclass
    snip derive instance @typeclass $0

  for typeclass <- @⟨Newtype,Generic⟩
  string d@⟨@typeclass:newtype,generic⟩
    name derive @typeclass
    snip derive instance @typeclass $1 _

  for typeclass <- @⟨Show,Debug⟩
  for lower <- @⟨@typeclass:show,debug⟩
  string g@lower
    name generic @lower instance
    snip
      instance @typeclass $1 where
        @lower = generic@typeclass

  string djson
    name derive json instances
    snip
      derive newtype instance EncodeJson $",
      derive newtype instance DecodeJson $1

  string gjson
    name generic json instances
    snip
      instance EncodeJson $1 where
        encodeJson = genericEncodeJson
      instance DecodeJson $1 where
        decodeJson = genericDecodeJson

block auto
  string ite
    name if-then-else
    snip if $1 then $2 else $0

  string caseof
    name pattern match
    snip
      case $1 of
        $2 -> $0

block start
  for module <- @⟨
    Map,
    HashMap,
    Set,
    HashSet,
    Array,
    List,
    String,
    Int,
    Number
  ⟩

  string imp@⟨@module:map,hashmap,set,hashset,array,list,string,int,number⟩
    name import Data.@module
    snip import Data.@module as @module