Skip to content

Instantly share code, notes, and snippets.

@danclien
danclien / Order.hs
Last active March 11, 2018 19:16 — forked from bohde/Order.hs
Example of Haskell code I see under tested a lot
module Order where
-- DBM is some Monad Transformer stack that allows us to talk to our DB (also a form of DI!)
placeOrder :: User -> OrderDetails -> DBM ()
placeOrder user details = do
-- Some users will have discounts for
(discount :: Maybe Discount) <- findRelevantDiscount user details
-- Create the specific order for this user with any discount
@danclien
danclien / README.md
Last active August 29, 2015 14:10 — forked from aaronlevin/build.sh
Look at the README.md

You should use the CommonJS version of path. If you want to grab path directly...

git clone https://github.com/pazguille/path from the working directory so it's loaded into ./path. I changed the require statement to point to that location.

{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE OverloadedStrings #-}
module Data.Validation.Aeson where
import Control.Applicative
import Control.Lens
import Data.Aeson
import qualified Data.HashMap.Strict as M
import Data.Maybe (fromMaybe)
import Data.Semigroup
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE FlexibleInstances #-}
import Control.Applicative
import Control.Monad
import Control.Monad.IO.Class (liftIO)
import Database.PostgreSQL.Simple
import Database.PostgreSQL.Simple.FromRow
import scalaz._
import Scalaz._
class InvoiceValidations {
def checkName(name: String): ValidationNel[String, String] = {
if (name.length > 100)
"name too long".failNel
else
name.successNel
}
import scalaz._, Scalaz._, shapeless._, ops.hlist.{ RightFolder, Tupler }
// Might as well stay generic in `F` for this part.
object applicativeFolder extends Poly2 {
implicit def caseApplicative[A, B <: HList, F[_]](implicit
app: Applicative[F]
) = at[F[A], F[B]] {
(a, b) => app.ap(a)(app.map(b)(bb => (_: A) :: bb))
}
}