Skip to content

Instantly share code, notes, and snippets.

View chpatrick's full-sized avatar

Patrick Chilton chpatrick

View GitHub Profile
@chpatrick
chpatrick / gist:d4f666e32d9ae7f39dd3
Last active August 29, 2015 14:22
Foreign dependency graph
{-# LANGUAGE GeneralizedNewtypeDeriving, TypeFamilies #-}
import Foreign
import System.IO.Unsafe
type family NodeType n
class Ref n where
withRef :: n -> (Ptr (NodeType n) -> IO b) -> IO b
@chpatrick
chpatrick / Bake.hs
Last active September 15, 2018 04:20
Baked-in Storable Vectors Mark II
{-# LANGUAGE MagicHash, TupleSections, TemplateHaskell #-}
module Data.Vector.Storable.Bake(bake, unsafeFromAddrLen) where
import Data.Typeable
import qualified Data.Vector.Storable as VS
import Foreign
import GHC.Prim
import GHC.Ptr
import Language.Haskell.TH
@chpatrick
chpatrick / tar-codec.hs
Created April 29, 2015 17:05
Tar de/serialization with Codec
{-# LANGUAGE TemplateHaskell #-}
import qualified Data.ByteString as B
import qualified Data.ByteString.Char8 as BC
import Codec
import Control.Monad
import Data.Word
import Data.Binary.Get
import Data.Binary.Put
import Numeric
@chpatrick
chpatrick / codec-enterprise-edition.hs
Created April 29, 2015 13:29
Codec Enterprise Edition - Easy bidirectional serialization with overloaded record fields
{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, LambdaCase, DataKinds, ScopedTypeVariables, FunctionalDependencies, PartialTypeSignatures, FlexibleContexts, RankNTypes, KindSignatures #-}
{-# LANGUAGE OverloadedStrings #-}
-- actual imports :)
import Control.Applicative
import Control.Category
import Data.Proxy
import GHC.TypeLits
import Prelude hiding (id, (.))
@chpatrick
chpatrick / codec-professional-edition.hs
Last active August 29, 2015 14:20
Easy bidirectional serialization with more type-level magic
{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances, LambdaCase, DataKinds, PolyKinds, ScopedTypeVariables, FunctionalDependencies #-}
{-# LANGUAGE OverloadedStrings #-}
-- actual imports :)
import Control.Applicative
import Control.Category
import Data.Proxy
import Prelude hiding (id, (.))
-- example imports
@chpatrick
chpatrick / codec.hs
Last active October 25, 2024 11:37
Composable Applicative bidirectional serialization
{-# LANGUAGE MultiParamTypeClasses, FlexibleInstances #-}
{-# LANGUAGE OverloadedStrings #-}
-- actual imports :)
import Control.Category
import Prelude hiding (id, (.))
-- example imports
import Control.Monad.Reader
import Control.Monad.Writer
@chpatrick
chpatrick / jsonarray.hs
Created April 28, 2015 19:37
JSON array conduit
import Conduit
import Control.Applicative
import Control.Monad
import Data.Aeson
import Data.Aeson.Parser
import Data.Attoparsec.ByteString.Char8 as AP
import qualified Data.ByteString.Char8 as BS
import Data.Conduit.Attoparsec
arrayConduit :: MonadThrow m => Conduit BS.ByteString m Value
@chpatrick
chpatrick / guncurry.hs
Last active August 29, 2015 14:19
Generalized uncurry without OverlappingInstances or other evil extensions
{-# LANGUAGE DataKinds, TypeFamilies, MultiParamTypeClasses, FlexibleInstances, GADTs, TypeOperators, FlexibleContexts, ConstraintKinds #-}
import Data.Tagged
type family FunResult f where
FunResult (a -> b) = FunResult b
FunResult x = x
type family FunArgs f where
FunArgs (a -> b) = a ': FunArgs b
@chpatrick
chpatrick / Applicator.hs
Last active August 29, 2015 14:19
I've been working on a Gameboy emulator and came up with this trick while trying to make an auto-documenting op table. It's general enough to do Spock-style routing too and doesn't require any language extensions or DataKinds magic.
{-# LANGUAGE OverloadedStrings, FlexibleInstances #-}
import Control.Applicative
import Control.Applicative.Free
import Control.Category
import Control.Monad.State
import Control.Monad.State
import Data.Functor.Coyoneda
import Data.Functor.Identity
import Data.List
@chpatrick
chpatrick / libffi-plus.hs
Last active August 29, 2015 14:15
libffi++
{-# LANGUAGE FlexibleInstances, TypeFamilies, FlexibleContexts #-}
module Foreign.LibFFI.Call
( ffi
, ffi'
, ffiRet
, ffiRet'
, FFIArg(..)
, FFIReturn(..)
, FFI()