Skip to content

Instantly share code, notes, and snippets.

View hborders's full-sized avatar

Heath Borders hborders

View GitHub Profile
hborders /
Created November 27, 2021 00:02
Generates named parameters for a constructor using a chain of interfaces
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import javax.annotation.Nonnull;
fun launchBrowser(context: Context, uri: Uri?) {
val browserIntent = Intent(Intent.ACTION_VIEW).apply { data = uri }
val browseActivities = context.packageManager.queryIntentActivities(browserIntent, PackageManager.MATCH_DEFAULT_ONLY)
for (info in browseActivities) {
if (info.activityInfo.packageName != context.packageName) {
try {
} catch (e: ActivityNotFoundException) {
public class AssertFailsWith {
public interface RunnableThatThrows {
void run() throws Throwable;
public static <T extends Throwable> void assertFailsWith(Class<T> throwableClass, RunnableThatThrows runnable) {
try {;
} catch (Throwable throwable) {
hborders /
Last active March 16, 2019 21:10
Demonstrates that CompactDecimalFormat#setMaximumFractionDigits and CompactDecimalFormat#setMaximumIntegerDigits don't work on Android API 24, but work on Android API 28.
import androidx.test.runner.AndroidJUnit4;
import org.junit.Test;
import org.junit.runner.RunWith;
import java.util.Locale;
import static org.junit.Assert.assertEquals;
public class CompactDecimalFormatTest {
hborders / move-subscription-after.sql
Last active March 1, 2019 06:22
Moves a subscription row after a given reference subscription row
Moves moving_id after reference_id by finding the next row after
reference_id and setting moving_id.sort to be the midpoint of
reference_id.sort and next_reference_id.sort
UPDATE subscription
SET sort = (
Get the first sort value after the reference_id
hborders / Heath-C-Java-Apple-Android.opml
Created February 3, 2019 06:26
An OPML of all the C, Java, Apple, and Android feeds I follow in Feedly.
<?xml version="1.0" encoding="UTF-8"?>
<opml version="1.0">
<title>Heath's C, Java, Apple, and Android feeds</title>
<outline text="C" title="C">
<outline type="rss" text="" title="" xmlUrl="" htmlUrl=""/>
<outline type="rss" text="Krister Walfridsson’s blog" title="Krister Walfridsson’s blog" xmlUrl="" htmlUrl=""/>
hborders / KotlinExtensions.kt
Created September 27, 2018 21:23
Some confusion over Kotlin extension methods
open class D {}
class D1: D() {}
fun {
// this seems like an override, but isn't
// It's good that the compiler doesn't let
// me add `override`, but it's still not clear
hborders / GenericIsKindOfClass.m
Created October 23, 2017 14:27
How to use Objective-C Generics with -isKindOfClass:
#import "MyNonClusteredClass.h"
@interface GenericIsKindOfClass<ObjectType : MyNonClusteredClass *> : NSObject
+ (instancetype _Nonnull)new NS_UNAVAILABLE;
- (instancetype _Nonnull)init NS_UNAVAILABLE;
- (instancetype _Nonnull)initWithInstanceOfObjectType:(ObjectType _Nonnull)instanceOfObjectType NS_DESIGNATED_INITIALIZER;
- (ObjectType _Nullable)typeSafeDowncastOrNil:(NSObject * _Nonnull)object;
hborders / BadUnpack.m
Created March 13, 2017 19:08
Trying to unpack the wrong distinct values from a sum type
static void badPrintExample(Example * _Nonnull example) {
[example switchFoo:^(ExampleBar * _Nonnull bar_) {
// ^
// error: incompatible block pointer types sending 'void (^)(ExampleBar * _Nonnull __strong)' to parameter of type 'void (^ _Nonnull)(ExampleFoo * _Nonnull __strong)'
NSLog(@"Bar: %@, %@", @(bar_.b), @(bar_.c));
bar:^(ExampleFoo * _Nonnull foo_) {
// ^
// error: incompatible block pointer types sending 'void (^)(ExampleFoo * _Nonnull __strong)' to parameter of type 'void (^ _Nonnull)(ExampleBar * _Nonnull __strong)'
NSLog(@"Foo: %@, %@", foo_.f, foo_.g);
hborders / BadInstantiation.m
Created March 13, 2017 19:06
Trying to instantiate a distinct type of a sum type with the wrong parameters
- (void)testWrongValues {
Example * _Nonnull fooExample = [[ExampleFoo alloc] initWithB:2 c:3];
// ^
// error: no visible @interface for 'ExampleFoo' declares the selector 'initWithB:c:'
Example * _Nonnull barExample = [[ExampleBar alloc] initWithF:@"foo" g:@"goo"];
// ^
// error: no visible @interface for 'ExampleBar' declares the selector 'initWithF:g:'