packages feed

cherry-core-alpha-0.1.0.0: src/Debug.hs

{-|

Module      : Debug
Description : This module can be useful while _developing_ an application.
License     : BSD 3
Maintainer  : terezasokol@gmail.com
Stability   : experimental
Portability : POSIX

-}


module Debug
  ( toString,
    log,
    todo,
  )
where

import Prelude (Show, error, show)
import Basics ((>>))
import String (String)
import qualified String
import qualified Debug.Trace


{-| Turn any kind of value into a string.

  >  toString 42                == "42"
  >  toString [1,2]             == "[1,2]"
  >  toString ('a', "cat", 13)  == "('a', \"cat\", 13)"
  >  toString "he said, \"hi\"" == "\"he said, \\\"hi\\\"\""

-}
toString :: Show a => a -> String
toString value =
  String.fromList (show value)


{-| Log a tagged value on the developer console, and then return the value.

  >  1 + log "number" 1        -- equals 2, logs "number: 1"
  >  length (log "start" [])   -- equals 0, logs "start: []"

It is often possible to sprinkle this around to see if values are what you
expect. It is kind of old-school to do it this way, but it works!

-}
log :: Show a => String -> a -> a
log message value =
  Debug.Trace.trace (String.toList (String.concat [message, ": ", toString value])) value


{-| This is a placeholder for code that you will write later.

For example, if you are working with a large union type and have partially
completed a case expression, it may make sense to do this:

  >  type Entity = Ship | Fish | Captain | Seagull
  >
  >  drawEntity entity =
  >    case entity of
  >      Ship ->
  >        ...
  >
  >      Fish ->
  >        ...
  >
  >      _ ->
  >        Debug.todo "handle Captain and Seagull"
  >

-}
todo :: String -> a
todo msg =
  error (String.toList msg)